2017-09-13 310 views
1

我正在努力匹配'字段'到多字段(或_all字段) 我想對cross_fields進行模糊匹配,但它不受支持。 任何想法如何做到這一點或任何其他方式來做到這一點?multi_match跨多個字段的模糊查詢

query: { 
    multi_match: { 
    query: term, 
    type: "cross_fields", 
    fields: ['_all'] 
    } 
} 

這裏試圖溶液

ElasticSearch multi_match query over multiple fields with Fuzziness

當出現此錯誤

[parsing_exception] Fuziness不允許型[cross_fields],其中 {線= 1 & col = 128}

elasticsearch版本5.0

編輯: 這裏是我通過搜索你的多個領域術語建設

bool: { 
     must: [ 
      { 
      fuzzy: { 
        _all: term 
        } 
      }, 
      { 
      fuzzy: { 
        "location.country": country 
        } 
      }, 
      { 
      fuzzy: { 
        "location.city": city 
        } 
      } 
      ] 
     } 
+0

一個字段上的cross_field是無意義的。 _all字段上的簡單匹配就足夠了。你會有模糊的可用性。 –

+0

@JulienTASSIN,我試過_all:fullTerm,它不工作。 fullTerm是術語+國家+城市 –

回答

1

cross_fields作品查詢。由於模糊不支持cross_fields,所以您必須以不同的方式編寫查詢。

一種可能是:實現你自己的「cross_fields」with shoulds並添加模糊性。

說你的詞是:「字詞1字詞2」中,你可以通過字邊界劃分(正則表達式\b),則應該將它們以這種形式:

{ 
    { 
    "query": { 
     "bool": { 
      "should": [{ 
        "match": { 
         "field1": "term", 
         "fuzziness": 1 
        } 
       },{ 
        "match": { 
         "field1": "term", 
         "fuzziness": 1 
        } 
       },{ 
        "match": { 
         "field2": "term1", 
         "fuzziness": 1 
        } 
       },{ 
        "match": { 
         "field2": "term12", 
         "fuzziness": 1 
        } 
       } 
      ] 
     } 
    } 
} 
} 

這是最佳的可能更少,如果你有很多領域,該查詢將成爲術語和字段的笛卡爾積。

重要注意事項您正在使用_all字段,它是一個字段。所有其他字段被索引到。也許你甚至不需要cross_fields?

+0

根據文檔,即使只有一個匹配,應查詢也會匹配。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html >如果bool查詢是一個過濾器上下文或者既沒有必要也沒有過濾,那麼至少有一個的查詢必須匹配一個文檔才能匹配bool查詢。 –