elasticSearch7版本文档中文属性模糊查询不准确

1、问题:es文档中的某个属性值name的值如下所示

name":"catalog=Catalog(value=699015935012372480, displayName=/默认分组),
status=3, updaterName=admin, updateTime=2023-02-01
14:33:17)status:已发布”

通过java模糊查询的api(QueryBuilders.fuzzyQuery)查询name为“已”的时候可以查询,查询为“已发布”的时候查询不出来。

2、原因:索引中没设置分词器

ps:索引中没设置分词器
elasticSearch7版本文档中文属性模糊查询不准确_第1张图片

ps:索引中设置分词器后
elasticSearch7版本文档中文属性模糊查询不准确_第2张图片

3、解决方案

3.1 给索引添加分词器(删除索引后,然后重新建立索引并设置分词器,如2中图所示)
3.2 换成QueryBuilders.matchPhraseQuery()的api(中文模糊查询推荐使用此api)

ps:matchPhraseQuery() 与 matchQuery()区别
matchPhraseQuery():使用matchPhraseQuery时,不会被分词器分词,而是直接以一个短语的形式查询;
matchQuery():在执行查询时,搜索的词会被分词器分词;

4、查看某索引的信息(比如是否用到分词器),代码如下

public class GetIndex {
    // index:log的名称
    private static final Logger log = Logger.getLogger("index");

    public static void main(String[] args) throws IOException {
        // 创建客户端对象
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("ip", 端口, "http"))
        );

        //1、查看索引
        // 请求对象
        GetIndexRequest request = new GetIndexRequest("user");
        // 发送请求
        GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
        // 响应信息
        log.info("aliases: = " + response.getAliases());  // 别名
        log.info("mappings: = " + response.getMappings());  // 映射
        log.info("settings: = " + response.getSettings());  // 设置信息
        // 关闭资源
        client.close();
    }
}

借鉴地址

你可能感兴趣的:(java,大数据,java,开发语言,elasticsearch)