2016-08-03 65 views
-1

我使用elasticsearch在搜索欄上給出自動搜索結果,但我希望它僅匹配單詞的開頭。例如。Elasticsearch - 僅在文字開始時獲得自動完成結果

doc_name_1 = "black bag" 
doc_name_2 = "abla bag" 

案例1. 在搜索欄的字符串是part_string = "bla"我目前使用的查詢是

query_body = {"query": { 
      "match": { 
       "_all": { 
        "query": part_string, 
        "operator": "and", 
        "type": "phrase_prefix" 

       } 
      } 
    }} 

此查詢返回doc_name_1doc_name_2命中。

我需要的僅僅是打doc_name_1因爲doc_name_1的啓動方式與查詢的字符串不同。 我試過使用"type":"phrase",但ES不斷在文檔中的文字「內」。是否可以通過修改查詢來做到這一點?或設置?

我會分享我的ES設置:

{ "analysis":{ 
       "filter":{ 
        "nGram_filter": { 
         "type": "ngram", 
         "min_gram": 1, 
         "max_gram":20, 
         "token_chars": [ 
          "letter", 
          "digit", 
          "punctuation", 
          "symbol" 
         ] 
       }}, 
       "analyzer":{ 
        "nGram_analyzer": { 
         "type": "custom", 
         "tokenizer": "whitespace", 
         "filter":[ 
          "lowercase", 
          "asciifolding", 
          "nGram_filter" 
         ] 
        }, 
        "whitespace_analyzer": { 
         "type":"custom", 
         "tokenizer": "whitespace", 
         "filter": [ 
          "lowercase", 
          "asciifolding" 
         ] 
       }}}} 

回答

1

使用edge n-gram代替正克。你正在分解這個詞的所有位置的文本,並填充倒排索引來反查。

+0

我想使用邊緣n-gram,但是應該將它與n-gram分析器或INSTEAD一起添加到設置中嗎?得到這個錯誤「Analyzer [nGram_analyzer]找不到字段[_all]」 –

+0

對不起,解決了上次評論中的問題,它與映射文檔有關。 –

+0

是的,你必須上傳新的設置,然後上傳新的映射,並將所有的文檔重新索引到ES。 – user3775217

相關問題