文字檢索是關系型資料庫(如 MySQL)的弱項,而恰恰是 ES 的強項。前一篇文章已經提到了 match、term,除此之外還有multi_match、match_phrace 等,分别的含義是:
match
從一個字段中檢索關鍵字,包括模糊檢索、精準單詞檢索以及短語檢索。
match_phrase
短語檢索。跟 match 相似,也是從一個字段中檢索文字,但是作為一個完整的短語檢索,不能拆分成為幾個單詞來檢索。
match_phrase_prefix
略。
multi_match
從多個字段中檢索關鍵字。其它與 match 相同。
common
query_string
simple_query_string
略。
match 的例子
GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
多個字段可以寫上多個 match,外面套上 must、must_not 或者 should。例如
GET /_search
{
"query": {
"bool": {
"should": [
{ "match" : { "title" : "this is a test" } },
{ "match" : { "content" : "this is a test" } }
]
}
}
}
multi_match 的例子
上面的例子用 multi_match 的寫法
GET /_search
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "title", "message" ],
"type": "most_fields"
}
}
}
如果省略 fields,表示将從全部字段中檢索關鍵字。type 還有一種很常用的用法:best_fields,表示關鍵字都出現在同一個字段的文檔将獲得高的 _score。
match_phrace 的例子
match_phrace 和 match 的用法類似。不同的是,match_phrace 搜尋的是完整的詞組。例如搜尋文字“程式設計語言”,match 将文字拆成兩個單詞“程式設計”和“語言”,比對到的文檔兩個關鍵字不必連在一起。而 match_phrace 要求關鍵字連在一起,而且剛好就是“程式設計語言”。如果用 MySQL 來做類比,match 更像模糊比對,而 match_phrace 就是精确比對。