6

我有一个弹性搜索索引,用户的字段如下:“name”:“kai”“age”:“23”“location”:“Delhi,India”“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(); 

提前致谢。:)

4

3 回答 3

8

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

这是一些关于如何访问“_all”字段以及如何使用MultiMatchQueryBuilderQueryBuilders创建MultiMatchQuery的示例代码。multiMatchQuery沿着查询在所有字段中搜索:

String queryString = "nosql delhi";

String allField = "_all";

MultiMatchQueryBuilder mmqb = QueryBuilders.multiMatchQuery(queryString, allField);
于 2015-01-14T20:55:45.107 回答
1

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

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

希望有帮助。

于 2014-12-31T10:43:28.620 回答
0

对于 Java 弹性 restHighLevelClient :

将“_all”替换为“*”。

String queryString = "nosql delhi";

字符串 allField = "*";

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

于 2020-12-14T08:40:20.337 回答