我有一个弹性搜索索引,用户的字段如... “名字”:“凯” “年龄”:“23” “位置”:“德里,印度” “tag”:[“search”,“nosql”] 等
我想在用户的所有字段中查询多个字符串(例如。[“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();
提前致谢。 :)
答案 0 :(得分:8)
在Java API中,您可以查询“_all”字段,该字段默认包含文档的所有字段。另一种方法是使用MultiMatchQuery,它更灵活,允许您指定要查询的字段列表。
以下是有关如何访问“_ all”字段的示例代码,以及如何使用MultiMatchQuery和MultiMatchQueryBuilder创建QueryBuilders。multiMatchQuery沿{ {3}}搜索query:
String queryString = "nosql delhi";
String allField = "_all";
MultiMatchQueryBuilder mmqb = QueryBuilders.multiMatchQuery(queryString, allField);
答案 1 :(得分:1)
如果您正在使用标准分析器,则弹性搜索会默认使用空格标记器对每个单词进行标记。
在这种情况下,您可以使用query string query进行搜索,您可以在其中添加多个要搜索的字段。此外,查询字符串查询的默认运算符为“OR”。因此,如果您的搜索词是“nosql delhi”(如您的情况),则将其翻译为“nosql OR delhi”并在查询中指定的所有字段中搜索。这样,您就可以在多个字段中搜索多个术语。
希望有所帮助。
答案 2 :(得分:0)
对于Java Elastic restHighLevelClient:
将“ _all”替换为“ *”。
String queryString =“ nosql delhi”;
字符串allField =“ *”;
MultiMatchQueryBuilder mmqb = QueryBuilders.multiMatchQuery(queryString,allField);