2016-01-10 65 views
1

返回精確值,我使用下面的查詢搜索文檔:Java的查詢從Elasticsearch

QueryBuilder qb = matchQuery(
       "username_field", 
       "user123" 
      ); 
SearchResponse response = Client().prepareSearch("users_dashboard").setQuery(qb) 
       .setSource("username_field") 
       .execute().actionGet(); 

但我想它返回到我,包含準確的用戶名一個文檔。但是,目前正在返回是一個例子: 搜索user123 都返回以下:

user123 
user123 lastname 
firstname user123 

但我只想user123返回。

我使用Elasticsearch 2.1.0

回答

0

您需要使用term query進行精確匹配。我假設你正在使用standard analyzer(默認值)爲user field所以你必須在你inverted index

  • user123下列標記(DOC 1,2,3)
  • 姓名(DOC 3)
  • 姓氏(DOC 2)

當您使用match query時,它將返回所有三個文檔。您需要將用戶字段映射爲index : not_analyzed,以便不執行分析。你的倒序索引看起來像這樣。

  • user123
  • user123姓氏
  • 姓user123

那麼這個查詢會給你想要的結果

QueryBuilder qb = termQuery(
       "username_field", 
       "user123" 
      ); 
+0

如何迪我設置映射到'not_analyzed'到一個已經現有索引? –

+0

雖然您可以將'not_anallyzed'設置爲現有索引,但它不會影響當前值,最好創建新索引並重新索引所有內容。 – ChintanShah25

+0

我明白了。另一個問題是,設置多個查詢將是query1 AND query2,或query1或query2? 意思是,我想匹配一個提到了一組單詞的用戶名:QueryBuilder qb1 = termQuery(「user.screen_name」,用戶名); QueryBuilder qb2 = matchQuery(「text」,Keywords);'並返回文檔數量。 ES會將此視爲「用戶名和關鍵字」,還是「用戶名或關鍵字」? –