2016-11-08 25 views
0

在閱讀official documentation和一些Q後A在這裏,我仍然無法讓我的Elasticsearch正確搜索沒有通配符的部分字詞。沒有通配符的ES搜索未使用分析器得到結果

我已經有〜470K條目的公司,並且想要在開始輸入公司名稱時完成某種自動完成。

指數得到這樣創建:

{ 
    "lei-index" : { 
    "aliases" : { }, 
    "mappings" : { 
     "record" : { 
     "properties" : { 
      "LegalName" : { 
      "type" : "text", 
      "analyzer" : "legalname_analyzer", 
      "search_analyzer" : "legalname_search" 
      } 
     } 
     } 
    }, 
    "settings" : { 
     "index" : { 
     "number_of_shards" : "5", 
     "provided_name" : "lei-index", 
     "creation_date" : "1478597987141", 
     "analysis" : { 
      "filter" : { 
      "legalname_filter" : { 
       "type" : "edge_ngram", 
       "min_gram" : "4", 
       "max_gram" : "20" 
      } 
      }, 
      "analyzer" : { 
      "legalname_analyzer" : { 
       "filter" : [ 
       "legalname_filter", 
       "lowercase" 
       ], 
       "type" : "custom", 
       "tokenizer" : "legalname_tokenizer" 
      }, 
      "legalname_search" : { 
       "filter" : [ 
       "legalname_filter", 
       "standard", 
       "lowercase" 
       ], 
       "type" : "custom", 
       "tokenizer" : "legalname_tokenizer" 
      } 
      }, 
      "tokenizer" : { 
      "legalname_tokenizer" : { 
       "token_chars" : [ 
       "letter" 
       ], 
       "min_gram" : "4", 
       "type" : "edge_ngram", 
       "max_gram" : "20" 
      } 
      } 
     }, 
     "number_of_replicas" : "1", 
     "uuid" : "mUBvjn9BSBayrkvXSIXxQw", 
     "version" : { 
      "created" : "5000051" 
     } 
     } 
    } 
    } 
} 

當我知道尋找可以說赫伯羅特勞埃德,我可以搜索「赫伯羅特」,並得到3個結果「赫伯羅特」,「赫伯羅特勞埃德「和」hapag loyd「

但是我想歸檔一下,我可以搜索」hapa「並獲得結果。

http://localhost:9200/lei-index/record/_search?pretty&q=hapa

0結果

使用通配符,我得到的結果,包括赫伯羅特,但我猜通配符較大的指標

http://localhost:9200/lei-index/record/_search?pretty&q=hapa *

是低效我試圖用關鍵字作爲標記器並將過濾器留出並僅使用標記器,但沒有得到預期的結果。

測試儀:

curl -XPOST 'localhost:9200/lei-index/_analyze?pretty' -d '{ "analyzer": "legalname_analyzer", "text": "hapag"}' 
{ 
    "tokens" : [ 
    { 
     "token" : "hapa", 
     "start_offset" : 0, 
     "end_offset" : 4, 
     "type" : "word", 
     "position" : 0 
    }, 
    { 
     "token" : "hapa", 
     "start_offset" : 0, 
     "end_offset" : 5, 
     "type" : "word", 
     "position" : 1 
    }, 
    { 
     "token" : "hapag", 
     "start_offset" : 0, 
     "end_offset" : 5, 
     "type" : "word", 
     "position" : 1 
    } 
    ] 
} 

將是巨大的,如果任何人都可以指出哪裏我的思維出了問題在這裏,因爲這是我第一次與elasticsearch工作。

還有最後一件事,我和哈帕德·勞伊德無關,我只是在這裏用它作爲例子。

感謝

+0

您是否嘗試過指定字段名稱,以便正確的分析儀在搜索時踢入? 'http:// localhost:9200/lei-index/record/_search?pretty&q = LegalName:hapa' – Val

+0

Darn !!當然,我沒有......你可以發佈這個答案嗎?並感謝您的快速回復 –

回答

1

做出如下要求,標準分析器爲query_string查詢踢在當。

http://localhost:9200/lei-index/record/_search?pretty&q=hapa 

這不是你想要的。相反,你需要指定LegalName域,以便search_analyzer該字段是槓桿:

http://localhost:9200/lei-index/record/_search?pretty&q=LegalName:hapa 

另一種解決方案是讓你的查詢,但與覆蓋標準分析器查詢字符串的自己的一個:

http://localhost:9200/lei-index/record/_search?pretty&q=hapa&analyzer=legalname_search 
+0

http:// localhost:9200/lei-index/record/_search?pretty&q = hapa&analyzer = legalname_analyzer 似乎不起作用,但指定字段。謝謝 –

+0

請確保圍繞整個查詢,包括單引號內的查詢字符串,否則'&'字符會被誤解 – Val