1. 程式人生 > >Elasticsearch 多欄位搜尋

Elasticsearch 多欄位搜尋

查詢很少是對一個欄位做 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