2014-12-02 53 views
5

我已经与像领域的用户的elasticsearch指数.. “名”:“佳” “时代”:“23” “位置”:“德里,“印度” “tag”:[“search”,“nosql”] 等搜索多个字符串在Elasticsearch所有领域使用Java API

我想在用户的所有字段中查询多个字符串(例如[“nosql”,“delhi”])。是否有可能使用Java API?

这是我使用的代码示例。 (但这与问题无关)它只是为了知道我现在使用的对象。

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery() 
       .must(QueryBuilders.matchAllQuery()); 
     if(location!=null) { 
      queryBuilder.must(QueryBuilders.matchQuery("location",location)); 
     } 
     BoolFilterBuilder filerBuilder=FilterBuilders.boolFilter();  
     for(String skill:skills){ 
      filerBuilder.must(FilterBuilders.rangeFilter("tags."+skill).from(0)); 
     } 
     filerBuilder.must(FilterBuilders.queryFilter(queryBuilder)); 
     if(age!=null) { 
      filerBuilder.must(FilterBuilders.rangeFilter("age").from(age[0]).to(age[1])); 
     } 
     SearchResponse response = client.prepareSearch("skillbin") 
       .setTypes("stackdump") 
       .setSearchType(SearchType.QUERY_AND_FETCH) 
       .setQuery(queryBuilder) 
       .setPostFilter(filerBuilder) 
       .addSort("reputation", SortOrder.DESC) 
       .execute() 
       .actionGet(); 
     SearchHits hits=response.getHits(); 

在此先感谢。 :)

回答

1

如果您使用标准分析器,elasticsearch默认使用空格标记器标记每个单词。

在这种情况下,您可以使用query string query进行搜索,您可以在其中添加多个字段进行搜索。查询字符串查询的默认运算符为“或”。所以如果你的搜索词是“nosql delhi”(就像你的情况那样),它会被翻译成“nosql OR delhi”并在查询中指定的所有字段中搜索。这样您就可以在多个字段中搜索多个术语。

希望有所帮助。

7

在Java API中,您可以针对“_all”字段进行查询,该字段默认包含文档的所有字段。另一种方法是使用MultiMatchQuery,它更加灵活,并允许您指定要查询的字段列表。

以下是关于如何访问“_all”字段的一些示例代码,以及如何使用MultiMatchQueryBuilderQueryBuilders创建MultiMatchQuerymultiMatchQuery沿query搜索in all the fields

String queryString = "nosql delhi"; 

String allField = "_all"; 

MultiMatchQueryBuilder mmqb = QueryBuilders.multiMatchQuery(queryString, allField); 
+0

感谢@hexabunny。 – 2016-09-20 20:12:40