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