2012-01-17 91 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();