我有一種情況,我將發票的元數據放入Elasticsearch 1.5.2索引中,該索引在Oracle Linux 15.04上使用Oracle JDK 8u45運行。其中一個字段是poNumber,通常具有類似「123-R45678」或「123-4Q5678」的值。我試圖使用PrefixQuery(通過查詢解析器)來搜索以前綴開頭的值,如「123-4 *」或「123-R *」。我是來成功最接近的是使用關鍵字分析儀上的採購單號碼字段,並在搜索時使用相同的關鍵字分析儀,用一個看起來像這樣的URL:Elasticsearch:關鍵字分析字段上的PrefixQuery中的連字符
http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4Q*&analyzer=keyword&analyze_wildcard=true&explain=true
這不返回任何結果,儘管「123- 4Q5678「正在進入指數。然而,當我搜索「123-4 *」,我得到的結果和它的「123-4Q5678」匹配:
http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4*&analyzer=keyword&analyze_wildcard=true&explain=true
關鍵字分析不應該做任何事情掰開的字符串。我甚至在_analyze端點進行了測試。尋找沒有連字符的值的前綴查詢似乎工作正常。爲什麼添加「Q」字符會導致此查詢不返回結果?如果字母恰好在連字符之後,也會發生這種情況。
而且,當存在連字符時,即使整個字符串值是PrefixQuery的「前綴」,也不會返回結果。但是,它確實在完全匹配查詢中返回結果。 (請參閱下面的內容)如果值或查詢中不存在連字符,則搜索精確值作爲前綴確實返回匹配的文檔。
下面是測試的其他一些結果:
value search term success
123-4Q5678 123* yes
123-4Q5678 123-* yes
123-4Q5678 123-4* yes
123-4Q5678 123-4Q* no
123-4Q5678 123-4Q5* no
123-4Q5678 123-4Q5678* no
123-4Q5678 123-4Q5678 yes
123-R45678 123* yes
123-R45678 123-* yes
123-R45678 123-R* no
123-R45678 123-R4* no
123-R45678 123-R45678* no
123-R45678 123-R45678 yes
r4q567 R* yes
r4q567 R4* yes
r4q567 R4Q* yes
r4q567 R4Q567* yes
r4q567 R4Q567 yes
您是否嘗試過使用[ngrams](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html)以及查詢DSL而不是前綴查詢?我在這裏寫了一篇關於ngram的博客文章:http://blog.qbox.io/an-introduction-to-ngrams-in-elasticsearch。如果這會有所幫助,我可以向您展示一個使用您在此發佈的數據的簡單示例。 –