2015-05-22 70 views
2

我有一種情況,我將發票的元數據放入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 
+0

您是否嘗試過使用[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。如果這會有所幫助,我可以向您展示一個使用您在此發佈的數據的簡單示例。 –

回答

2

你也可以用q=...的語法來完成。 q=...refers to query_string實際上,但是是一個較短的版本。

query_string有點令人困惑,因爲它有一些默認值,需要注意某些情況來解釋某些情況。

這就是您的嘗試情況:默認情況下,存在名爲lowercase_expanded_terms的設置,即true。這樣做是爲了小寫輸入字符串。因此,當您搜索123-4Q*時,實際上您正在搜索123-4q*(小寫)。但是,在您分析的keyword索引中,您的大寫Q永遠不會匹配。

您的查詢將用下面的命令工作:

http://localhost:9200/myindex/_search?q=invoices.poNumber:123-4Q*&analyzer=keyword&lowercase_expanded_terms=false 

如果你想知道爲什麼123-4Q5678比賽儘管是大寫的,是因爲lowercase_expanded_terms適用於某些情況下,通配符是其中之一:

是否自動將通配符,前綴,模糊和範圍查詢的條件設置爲下限(因爲未對其進行分析)。默認它是真的。

+0

+!謝謝,這絕對是問題!我也意識到,我以R開頭的那些測試例子實際上在索引中是小寫的,這就是爲什麼他們回來了。我更新了原始問題以更正測試數據。 – Paul

-2

@paulirwin @searchtechbot 當指數在現場使用edgeGram濾波器分:1,最長爲10個,並且不使用前綴的查詢只匹配關鍵字。這是怎麼回事,你是索引每個部分的單詞,如:「1」「12」「123」「123-」「123-4」等....所以只要匹配它會發現你的任何部分如果是從你的單詞開始的話。

相關問題