2015-09-10 82 views
0

我在完全理解我試圖用java API(v1.7.1)構建的elasticsearch查詢的行爲時遇到了一些麻煩。以下是最初的SearchRequestBuilder;Elasticsearch java API查詢行爲奇怪

SearchRequestBuilder builder = client.prepareSearch("my_index") 
      .setTypes("my_document_type") 
      .setSearchType(SearchType.DFS_QUERY_THEN_FETCH); 

我有一兩個和titlecontent索引文檔的集合。當我嘗試匹配title字段中的短語時,

builder.setQuery(QueryBuilders.matchPhraseQuery("title", keyword)); 

然後,當然,

SearchResponse response = builder.execute().actionGet(); 

此查詢的行爲作品完全一樣我希望 - 我的搜索返回基於關閉的title字段的內容高度相關的結果 - 到目前爲止好。

但是,當我嘗試向構建器添加另一個查詢時;

builder.setQuery(QueryBuilders.matchQuery("content", keyword)); 

我原來非常相關的結果(基於標題內容)現在不太可以理解。例如,一個搜索短語(關鍵字)「這是一個測試」將返回那個短語單詞逐個存在的地方(在標題中) - 就像我說的那樣,完美。然而,現在增加第二個查詢使得那些以前相關的文檔完全從結果中刪除 - 無處可查。即使相同的文本與以前相同的字段匹配。顯然,我做錯了什麼,我只是不明白什麼 - 或者如何實現預期的行爲,即匹配關鍵字titlecontent並返回相關結果,這意味着如果在title I中存在非常接近的短語匹配預計會看到這些文件得分更高。我也嘗試過增強效果,

builder.setQuery(QueryBuilders.matchPhraseQuery("title", keyword).boost(5.0f)); 
builder.setQuery(QueryBuilders.matchQuery("content", keyword)); 

任何援助將不勝感激。

回答

0

通過調用setQuery第二次你是不是加入查詢 - 你是(顧名思義)設置查詢,即更換了新的一個先前設置的查詢。

如果你想在您使用複合查詢,如bool需要combine them同時使用這兩種查詢:

builder.setQuery(QueryBuilders.boolQuery() 
    .should(QueryBuilders.matchPhraseQuery("title", keyword).boost(5.0f)) 
    .should(QueryBuilders.matchQuery("content", keyword)));