2016-03-09 99 views
0

我有一個使用Java API的現有ElasticSearch查詢:模糊化現有ElasticSearch的Java API查詢

BoolQueryBuilder queryBuilder = 
    boolQuery().should(queryStringQuery(theUsersQueryString)); 
SearchResponse response = client.prepareSearch(...).setQuery(queryBuilder); 

現在我想添加模糊到這一點,允許未成年人拼寫錯誤仍然返回的東西給用戶。我的猜測是,將模糊參數的QueryBuilders對象將取得成果:

boolQuery().should(queryStringQuery(theUsersQueryString) 
       .fuzziness(Fuzziness.ONE) 
       .fuzzyMaxExpansions(4) 
       .fuzzyPrefixLength(2)); 

可惜,這似乎並沒有工作,我迄今無法找到這種良好的文檔。例如,我在我的數據庫中有字符串John Deere。如果我使用查詢字符串deere,則會得到一個匹配項,但如果我使用查詢字符串DeereeDeeer,則不會。

我的問題是:我應該如何正確模糊我的查詢?

+0

你是否[通過此](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness)? – Val

+0

@Val:是的,我希望我上面提出的代碼可以工作,因爲我已經嘗試了不同的參數值組合,但到目前爲止我一直無法得到模糊的結果,所以我認爲還有更多與它有關的Java API。 – Gruber

+0

您還可以顯示一些示例數據,您輸入到'theUsersQueryString'的值以及您期望的結果嗎? – Val

回答

1

我選擇創建一個新的查詢,而不是修改現有的查詢。

MultiMatchQueryBuilder fuzzyMmQueryBuilder = multiMatchQuery(
       theUsersQueryString, "field1", "field2", ... , "fieldn").fuzziness("AUTO"); 
BoolQueryBuilder b = boolQuery().should(fuzzyMmQueryBuilder); 
SearchRequestBuilder srb = client.prepareSearch(...).setQuery(b)... 
SearchResponse res = srb.execute().actionGet(); 

此查詢展示模糊行爲。