2017-04-14 54 views
0

我們有一個ElasticSearch索引,其中一些字段使用自定義分析程序。其中一個分析器包括一個uppercase標記過濾器,以便在查詢時去除大小寫敏感(例如,我們希望「球」也匹配「球」或「球」)使用'大寫'標記過濾器查詢文檔的正確方法

這裏的問題是在執行正則表達式,該模式與全部大寫的索引中的術語相匹配。因此,「app *」與我們索引中的「Apple」不匹配,因爲幕後它的真正索引爲「APPLE」。

有沒有辦法讓這個工作而不做一些ES以外的黑客事情?

我可能會玩弄「query_string」,而不是看看是否有任何不同的結果。

回答

0

這一切都取決於您正在使用的查詢的類型。如果該類型將使用字段本身的分析器來分析輸入字符串,那麼它應該沒問題。

如果您使用的是regexp查詢,則此查詢不會分析輸入字符串,因此如果您將app.*傳遞給它,它將保持不變,這將用於搜索。

但是,如果你使用正確query_string查詢一個應該工作:

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my": { 
      "type":  "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "uppercase" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "some_field": { 
      "type": "text", 
      "analyzer": "my" 
     } 
     } 
    } 
    } 
} 

和查詢本身:

{ 
    "query": { 
    "query_string": { 
     "query": "some_field:app*" 
    } 
    } 
} 

,以確保它在做什麼,我覺得是,我總是用_validate api:

GET /_validate/query?explain&index=test 
{ 
    "query": { 
    "query_string": { 
     "query": "some_field:app*" 
    } 
    } 
} 

這將顯示ES對輸入字符串做了什麼:

"explanations": [ 
    { 
     "index": "test", 
     "valid": true, 
     "explanation": "some_field:APP*" 
    } 
    ]