【问题标题】:Searching multiple strings in all fields in Elasticsearch using Java API使用 Java API 在 Elasticsearch 的所有字段中搜索多个字符串
【发布时间】:2015-01-30 08:41:08
【问题描述】:

我有一个弹性搜索索引,用户的字段如下: “名称”:“凯” “年龄”:“23” “位置”:“德里,印度” “标签”:[“搜索”,“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(); 

提前致谢。 :)

【问题讨论】:

    标签: java elasticsearch elasticsearch-plugin nosql


    【解决方案1】:

    对于 Java 弹性 restHighLevelClient :

    将“_all”替换为“*”。

    String queryString = "nosql delhi";

    String allField = "*";

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

    【讨论】:

      【解决方案2】:

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

      这里是一些示例代码,介绍如何访问“_all”字段以及如何使用MultiMatchQueryBuilderQueryBuilders.multiMatchQuery 以及query 搜索in all the fields 来创建MultiMatchQuery

      String queryString = "nosql delhi";
      
      String allField = "_all";
      
      MultiMatchQueryBuilder mmqb = QueryBuilders.multiMatchQuery(queryString, allField);
      

      【讨论】:

      • 谢谢@hexabunny。
      【解决方案3】:

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

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

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-12-14
        • 2021-11-05
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        相关资源
        最近更新 更多