Elasticsearch 多欄位搜尋
阿新 • • 發佈:2018-11-11
查詢很少是對一個欄位做 match 查詢,通常都是一個 query 查詢多個欄位,比如一個 doc 有 title、content、pagetag 等文字欄位,要在這些欄位查詢含多個 term 的 query,就要對它們的相關度評分做合理的合併。這被稱為多詞(multiword)、多欄位(multifield)查詢。
如果一個 query 可以通過 QR 結構化,如哪些詞是 title,哪些詞是 author,那麼就可以直接在相關欄位中查詢,使用布林查詢即可解決問題,布林查詢是“匹配越多越好”,如搜“War and Peace Leo Tolstoy”,查詢語句如下:
GET /_search { "query": { "bool": { "should": [ { "match": { "title": "War and Peace" }}, { "match": { "author": "Leo Tolstoy" }} ] } } }
還可以對不同的欄位加不同的 boost 權重。
以上被稱為多重查詢字串,也可算是結構化查詢,不過現實中通常是一個 query 在多個欄位中查詢,即單一查詢字串。畢竟對 query 做結構化需要些 nlp 技術和額外的人力成本,且比起單一查詢字串的效果提升也有限,所以若不是對召回效果有更高追求,還是不要輕舉妄動,就好好做一個 query 在多個欄位的查詢吧。
一個 query 在多個欄位中的查詢,也根據資料形態的不同有三種策略:best_fields、most_fields、cross_fields。
1. best_fields
2. most_fields
3. cross_fields
4. phrase
5. phrase_prefix
參考資料
- Elasticsearch: 權威指南:https://es.xiaoleilu.com/110_Multi_Field_Search/10_Single_query_string.html
- Elasticsearch Reference:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html