2016-05-31 27 views
1

我已經索引的文檔,每一個領域:「代號爲」具有類似的值如下:如何在elasticsearch中匹配「prefix」而不是整個字符串?

document 1 has CodeName: "AAA01" 
document 2 has CodeName: "AAA02" 
document 3 has CodeName: "AAA03" 
document 4 has CodeName: "BBB02" 

當我嘗試在野外使用匹配查詢:

query: { 
"match": { 
"CodeName": "AAA" 
} 
} 

我期待得到「AAA01」和「AAA02」的結果,但相反,我得到一個空數組。當我通過「AAA01」(我輸入了全部內容)時,我得到了一個結果。我如何使它更一般地匹配?我嘗試使用「前綴」而不是「匹配」,並得到同樣的問題。

「CodeName」的映射是「type」:「string」。

回答

1

我期望得到的結果對於「AAA01」和「AAA02」

這不是Elastic Search所期望的。 ES使用您指定的標記器將您的字符串分解爲標記。如果您沒有指定任何標記器/分析器,則默認標準標記器會將空格和連字符等單詞分開。在您的情況下,標記存儲爲「AAA01」,「AAA02」等。沒有像「AAA」這樣的術語,因此你沒有得到任何結果。

要解決此問題,可以使用match_phrase_prefix查詢或將匹配查詢的類型設置爲phrase_prefix。試試這個代碼:

"query": { 
     "match_phrase_prefix": { 
      "CodeName": "AAA" 
     } 
    } 

OR

"query": { 
     "match": { 
      "CodeName": { 
       "query": "AAA", 
       "type": "phrase_prefix" 
      } 
     } 
    } 

下面是文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html。另請注意max_expansions參數,因爲此查詢有時可能會變慢,具體取決於您的數據。

請注意,對於這種技術,您應該使用默認映射。你不要使用nGram。

+0

謝謝!你想什麼時候使用nGram? – Rolando

+0

nGram在創建索引時需要更多時間,並且需要更多的存儲空間,但同時提供更快的搜索,因爲所有的標記都是預先計算好的。如果數據集很大,並且需要多個標記組合,如「AA」,「AAA」,「AAA0」,「AAA01」,則使用nGram更有意義。對於像您這樣簡單的需求和有限的數據集,phrase_prefix通常足夠簡單。 – Ibrahim

0

據我所知,首先你應該使用nGram類型的標記器索引你的數據。

您可以檢查detailes in documentation

發表評論相關: 我熟悉使用elasticsearch的symfony的路,我們用這樣的:

indexes: 
    search: 
     client: default 
     settings: 
      index: 
       analysis: 
        custom_index_analyzer: 
        type: custom 
        tokenizer: nGram 
        filter: [lowercase, kstem] 
       tokenizer: 
        nGram: 
         type: nGram 
         min_gram: 2 
         max_gram: 20 
    types: 
     skill: 
      mappings: 
       skill.name: 
        search_analyzer: custom_index_analyzer 
        index_analyzer: custom_index_analyzer 
        type: string 
        boost: 1 
+0

我該如何設置?我是否必須爲「CodeName」字段明確聲明?如果是這樣,怎麼樣? – Rolando

+0

在索引文件的過程中(目前爲3個索引),它似乎仍然無法正常工作......不確定這是否因爲分析器在所有文檔完成索引或其他事情之後踢入分析器......此時,甚至沒有「 AAA01「能夠匹配。 – Rolando

+0

如果您正在使用本地計算機,則可以在瀏覽器中打開「http://127.0.0.1:9200/_cat/indices?v'」,以查看所有索引和「http://127.0.0.1:9200/ /_search /?type = &pretty = true'來檢查某些類型的細節 –

相關問題