2014-10-29 76 views
0

比方說,我已經索引的文件是這樣的:ElasticSearch:搜索更多像這樣的Java

{ 
    "_index": "indexapm", 
    "_type": "membres", 
    "_id": "3708", 
    "_score": 1, 
    "_source": { 
      "firstname": "John", 
      "lastname": "GUERET-TALON" 
    } 
} 

我想取出這個文檔「故而」,「GUERET」,「TAL」進行搜索時,例。

我有一個Java應用程序,我想這一點:

MoreLikeThisQueryBuilder qb = QueryBuilders.moreLikeThisQuery(
      "firstname^3", 
      "lastname^3") 
      .likeText("GUER"); 

SearchResponse response = client.prepareSearch("myindex") 
      .setTypes("mytype") 
      .setSearchType(SearchType.DFS_QUERY_AND_FETCH) 
      .setQuery(qb)    // Query 
      .setFrom(0) 
      .setSize(limit) 
      .setExplain(true) 
      .execute() 
      .actionGet(); 

但這搜索doen't找回我的文檔。當然,如果我嘗試完全匹配查詢並搜索「GUERET」,它就會起作用。

有誰知道我必須使用什麼樣的查詢以及如何使它與Java庫一起工作?謝謝!

回答

0

在這種情況下,更喜歡此查詢不是最佳選擇。

如上所述,如果您正在使用第一個字母單詞查找文檔,則應該使用前綴查詢,但它們僅限於一個字段。要在多個字段上搜索,請使用MultiMatch Query(提供PHRASE_PREFIX類型)。我會嘗試這樣的:

QueryBuilders.multiMatchQuery("GUER", "firstname", "lastname") 
    .type(MatchQueryBuilder.Type.PHRASE_PREFIX); 
+0

就嘗試過,但似乎並沒有給出任何結果。如果我想從「UERET」獲得結果,那麼該怎麼辦?因爲它不在詞的開頭? – litil 2014-10-31 13:20:34

0
QueryBuilders.boolQuery().should(QueryBuilders.wildcardQuery("lastname", "*GUER*")); 

我使用WildcardQueryBuilder得到的結果是產生以下:

{"bool":{"should":[{"wildcard":{"firstname":"*GUER*"}}]}}