2012-01-17 165 views
1

我使用elasticsearch查詢字符串格式

SearchBuilder.searchSource.query(query_string).buildAsBytes() 

執行上elasticsearch服務器的查詢字符串。

問題是我不知道什麼是查詢字符串的正確格式。舉例來說,我想找到country場的所有文件是US,我可以使用的

http://my.elastic.search.server/foo/dummy/_search?q=country:US 

RESTful API實得到我所需要的。但在java api方面,我試過country:US,q=country:US{\"country\":\"US\"},但是每次我回到SearchPhaseExecutionException

ElasticSearch的文檔沒有說明在這種情況下查詢字符串的格式是什麼,並且我已經用盡了與該主題相關的Google結果。有人可以幫助我嗎?謝謝!

+0

「SearchPhaseExecutionException」是什麼意思? – skaffman 2012-01-17 20:22:32

+0

你想通過java創建json還是要使用Java API? – Karussell 2012-01-21 21:20:39

+0

因此,'更人爲的JSON'作品,並推薦「國家:美國」不起作用? – Dennis 2012-05-16 23:10:49

回答

2

好的。好像我需要一個更做作JSON字符串傳遞

{ 「QUERY_STRING」:{ 「default_field」: 「anotherFoo」, 「查詢」: 「這與該公司或有」 } }

這是有用的,我可以傳遞純彈性搜索與elasticsearch的查詢。

4

基於您的REST查詢根據Search Java API相當於將是:

SearchResponse response = client.prepareSearch("foo") 
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) 
    .setQuery(termQuery("country", "US")) 
    .execute() 
    .actionGet(); 

你也可以使用一個純粹的查詢字符串爲您的REST例如:

.setQuery(queryString("country:US")) 

最好的參考就是Javadoc在Maven repository中可用。

+0

這也應該工作:-) – Sheng 2012-01-18 15:07:53

+1

** termQuery()**的來源是什麼? – 2012-12-17 17:09:08

1

一個老問題,但我掙扎了不少類似的查詢,我以爲我想補充我的兩分錢。 首先我找不到

SearchBuilder.searchSource.query(query_string).buildAsBytes() 

正如原來的問題更多的在ES的Java API提及。

我的要求的身體看起來就像

{ 
    "query": { 
    "query_string": { 
     "default_field": "file", 
     "query": "Java" 
    } 
    }, 
    "highlight": { 
    "fields": { 
     "file": { 

     } 
    } 
    } 
} 

我發現這可以在以下兩種方式

String queryString = "{" 
      + "\"query_string\": " 
       + "{" 
        + "\"default_field\":" 
       + " \"file\"," 
         + " \"query\": \"Email OR @gmail.com @yahoo.com\"" 
         + "}" 
         + "}"; 

第一種方法

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();   
    searchSourceBuilder.query(queryString); //or searchSourceBuilder.query(queryString).buildAsBytes(); 

    SearchRequestBuilder searchRequestBuilder = new SearchRequestBuilder(ESConnectionFactory.INSTANCE.getClient()) ; 
    searchRequestBuilder.internalBuilder(searchSourceBuilder).setIndices("resume") 
    .setTypes("docs").addHighlightedField("file"); 
完成

第二種方法

SearchRequestBuilder searchRequestBuilder = client.prepareSearch() 
       .setIndices("resume") 
       .setTypes("docs").setQuery(queryString).addHighlightedField("file"); 

然後標準

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

鍵要注意的事情

  1. 不要添加 「查詢」 中查詢字符串
  2. 請勿在查詢字符串中添加突出顯示的字段。使用addHighlightedField
1

我覺得這應該工作。

QueryBuilder qb = QueryBuilders.queryStringQuery("pattern").field("field to search"); 
SearchRequestBuilder sreq = client.prepareSearch("INDEX").setTypes("TYPE").setQuery(qb); 
SearchResponse response = sreq 
       .setFrom("From page") 
       .setSize("size") 
       .execute().actionGet();