elasticsearch通配符模糊查询返回无结果

一、问题描述

在实现一个字段模糊查询的时候,日志索引下的title字段可以模糊查询。但是在另一个站点索引下title字段不可以模糊查询,输入一个词可以查询出结果,输入多个词语组合没有结果,整个标题输入也没有结果。

二、分析

1、分析代码后锁定查询条件。

最开始设置的处理条件时,两个搜索最后都是进入的like(相似)查询,执行搜索的语句为:

boolQueryBuilder.must(QueryBuilders.wildcardQuery(property, "*" + String.valueOf(value) + "*"));

后来查询资料分析,以为是字段内容长短的问题,不能精确搜索,因为must加了should,进行联合查询:

boolQueryBuilder.must(QueryBuilders.wildcardQuery(property, "*" + String.valueOf(value) + "*"))
        .should(QueryBuilders.termQuery(property, String.valueOf(value)).boost(2));

但是依然没有用!!!

2、更换查询方法。

查询资料后更换了几种方法,最后matchquery生效,站点索引下的数据可以模糊查询出来了,不管是关键字还是整个标题搜索都没有问题。

boolQueryBuilder.must(QueryBuilders.matchQuery(property, value).minimumShouldMatch("80%"));

但是!!!

日志索引又出了问题,因为使用的是同一个查询条件。日志索引必须输入title的全部内容才能查出数据来。

后来就思考能不能模糊查询的同时精确查询同一个字段,就搜索到了关于分词器的内容。

3、索引数据里面的字段是否分词对查询条件有影响。

查找了关于分词器的内容后,找到自己两个索引里面,日志索引里title字段没有分词,因为要聚合搜索次数,不能进行分词处理。而站点索引里,title字段是进行了分词处理的。

最后发现分词后的字段使用通配符是存在问题的。也就是,通配符查询不适用于分词字段的模糊查

三,处理结果

分词影响了查询条件,就把两个搜索根据是否分词在前端进行处理,加上Operator的类型。没有分词处理使用like,用通配符查询。分词使用in,用matchquery。

四、总结

1、字段分词模糊搜索不适合使用通配符查询。

2、字段前后都是用星号模糊查询,还有另一个影响:当搜索字段很长的时候,wildcard Query执行非常慢,非常消耗CPU。可参考博客https://www.cnblogs.com/raoshaoquan/p/7083844.html



你可能感兴趣的:(elasticsearch)