elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

java:Elasticsearch列出冗余值

java:Elasticsearch列出冗余值,java,elasticsearch,Java,elasticsearch,我已经习惯elasticsearch很长一段时间了,但现在我试图找到的解决方案是列出给定搜索字符串的准确值 我现在用java编写的代码: BoolQueryBuilder queryBuiler = new BoolQueryBuilder(); queryBuiler.must(new QueryStringQueryBuilder("tagName : *salary march*")); SearchResponse response = esclient.pre

我已经习惯elasticsearch很长一段时间了,但现在我试图找到的解决方案是列出给定搜索字符串的准确值

我现在用java编写的代码:

BoolQueryBuilder queryBuiler = new BoolQueryBuilder();
            queryBuiler.must(new QueryStringQueryBuilder("tagName : *salary march*"));

SearchResponse response = esclient.prepareSearch(index).setTypes(type)
                    .setQuery(queryBuiler)
                    .execute().actionGet();

SearchHit[] hits = response.getHits().getHits();
                    for (SearchHit hit : hits) {
                    Map map = hit.getSource();
                    System.out.println((String) map.get("tagName"));
                    list.add((String) map.get("tagName"));
                }

                list = list.stream().distinct().collect(Collectors.toList());

                for(int i = 0; i < list.size(); i++){
                System.out.println(list.get(i)); 
                }
是否可以对所提到的所有搜索字符串进行精确匹配的部分单词搜索?也就是说,如果我搜索三月工资,那么我希望结果只包含三月工资单


非常感谢您的帮助和提前感谢。

您可以尝试在查询字符串中添加and条件:

GET string/string/_search
{
  "query": {
    "query_string": {
      "default_field": "tagName",
      "query": "salary AND march"
    }
  }
}
它在结果字符串中只返回三月工资单,因为它是唯一同时包含薪水和三月工资的字符串

在Java中:

new QueryStringQueryBuilder("tagName : salary AND march")

最重要的是您正在使用queryStringQuery

这将首先拆分查询,然后搜索生成的令牌。和默认运算符,即或 所以你得到的文件要么与薪水匹配,要么与三月匹配

以下是解决方法

        BoolQueryBuilder queryBuiler = new BoolQueryBuilder();
        queryBuiler.must(new QueryStringQueryBuilder("tagName : *salary march*").defaultOperator(Operator.AND));

SearchResponse response = esclient.prepareSearch(index).setTypes(type)
                .setQuery(queryBuiler)
                .execute().actionGet();

SearchHit[] hits = response.getHits().getHits();
                for (SearchHit hit : hits) {
                Map map = hit.getSource();
                System.out.println((String) map.get("tagName"));
                list.add((String) map.get("tagName"));
            }

            list = list.stream().distinct().collect(Collectors.toList());

            for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i)); 
            }
    }
此外,我认为你没有得到弹性搜索的基本概念

在摄取期间根据索引的术语搜索查询

我认为应用于你们这个领域的分析器是标准的,可以生成代币

薪水 滑倒 前进 搜索将在此基础上进行,而不是在索引的实际内容上进行


因此,无需使用通配符查询。

非常感谢您的努力和回复!从来没有想过默认运算符。再次感谢你:很高兴它有帮助!
        BoolQueryBuilder queryBuiler = new BoolQueryBuilder();
        queryBuiler.must(new QueryStringQueryBuilder("tagName : *salary march*").defaultOperator(Operator.AND));

SearchResponse response = esclient.prepareSearch(index).setTypes(type)
                .setQuery(queryBuiler)
                .execute().actionGet();

SearchHit[] hits = response.getHits().getHits();
                for (SearchHit hit : hits) {
                Map map = hit.getSource();
                System.out.println((String) map.get("tagName"));
                list.add((String) map.get("tagName"));
            }

            list = list.stream().distinct().collect(Collectors.toList());

            for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i)); 
            }
    }