ElasticSearch中文模糊查询只能搜索单个字符的问题

发布于:2024-05-18 ⋅ 阅读:(83) ⋅ 点赞:(0)

问题:

通配符和fuzziness都只能搜索一个字,多个字就不起效【中文】

只能搜出来英文譬如java,dior,vue等英文

        if(StrUtil.isNotEmpty(schoolName)){
            searchSourceBuilder.query(QueryBuilders.boolQuery()
            .must(QueryBuilders
            .wildcardQuery("school","*"+schoolName+"*")));
        }

             searchSourceBuilder.query(QueryBuilders
            .fuzzyQuery("major",majorName)
            .fuzziness(Fuzziness.AUTO));

原因:

ES默认分词规则不能支持中文,通过安装IK Analysis for Elasticsearch支持中文分词。

解决方法:

第一步 下载Ik分词器插件

1、对应elasticsearch版本下载相应的IK版本

下载地址

https://github.com/medcl/elasticsearch-analysis-ik/releases 

2.下载后解压到elasticsearch的plugins文件下【注意只留文件夹】

3. 重启elasticsearch

出现下图红框内字,即为成功

第二步配置elasticsearch

@Configuration
public class ElasticSearchClientConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")));
        return client;
    }
}

第三步 配置实体类

/@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
 * 我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。
 * @Field这里ik_max_word是按最细粒度分词,ik_smart是按最粗粒度分词。
 *在搜索的时候用粗粒度,在写入的时候用细粒度。
 */
@Document(indexName = "article",type = "article")
public class Article implements Serializable {
    @Field(type = FieldType.Text, searchAnalyzer = "ik_smart", analyzer = "ik_max_word")
    private String title;


@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
@Field这里ik_max_word是按最细粒度分词,ik_smart是按最粗粒度分词

第四步 实现精确搜索

term不会分词,keyword字段也不分词,安装了ik分词器,ik分词器是会默认分词的,

所以java中就不能再使用

TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(“title”,keyword);这种方法了

应该换成完全匹配的模式

MatchPhraseQueryBuilder matchPhraseQueryBuilder

= QueryBuilders.matchPhraseQuery(“title”, keyword);


       //精准匹配
       //TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword.toLowerCase());
       MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("title", keyword);
       sourceBuilder.query(matchPhraseQueryBuilder);

参考网址:

Elasticsearch中文高亮精确搜索问题,单字可以,多字不行等_text[] fragments = title.fragments()-CSDN博客

ElasticSearch中文搜索时只支持单个字符如何解决?(已解决)_java es搜索引擎支持一个字搜索-CSDN博客 


网站公告

今日签到

点亮在社区的每一天
去签到