springboot整合elasticsearch中的分词查询配置

前言:elasticsearch最好还是在linux中进行集群部署,这样更符合企业需求和规范,笔者只在windows的单节点9200端口上部署,仅用于测试和学习。

 

什么是分词查询:

  指的是将输入的文本或查询语句切分成一个个独立的词语或词项,以便更好地处理和分析,然后进行查询,比如你在百度上搜索”成都春熙路“,那么你会发现在成百上千的响应结果中,不仅仅有包含”成都春熙路的“,还有包含”成都的“,这就说明分词查询不是像模糊查询那样,前者还对”成都春熙路进行了分词处理,再进行查询“。

 

案例需求:

  现在es的索引”x“中存储了三条数据:

userList.add(new UserDto("斌哥教你学vue", "123"));  (这两个字段对应实体类的属性为"account"和"password")

userList.add(new UserDto("vue2-斌哥在线教学", "456")); 

userList.add(new UserDto("vue2 by binge","678"));

现在只用”vue“作为查询词,将这三条数据都查到。

 

核心代码:

复制代码
  SearchRequest searchRequest = new SearchRequest("x");

        // 创建查询构建器,第一个参数是要查询的文本,剩下的参数是字段,就是查询 account 和 password 中同时满足条件的列
        MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("vue", "account")

                .fuzziness(10)  //:使用编辑距离技术进行模糊匹配,比如设置了fuzziness为2,并将查询词项设置为"quik"。

                //现在查询quick,由于查询词项与文档中的词项 “quick” 存在拼写差异,它们的编辑距离为1,小于等于允许的最大编辑距离2,因此这个文档将被认为是匹配的

                .prefixLength(0) //prefixLength参数用于指定模糊匹配的起始单词数。

                // 当设置prefixLength参数的值为0时,表示模糊匹配将从查询词项的开头进行匹配,而不需要词项的前几个字符匹配成功

                .operator(Operator.fromString("OR")) //operator参数用于指定多个查询词项之间的逻辑操作符。

        //Operator.fromString(“OR”)表示使用OR操作符,这意味着通过match查询匹配的文档至少需要与查询中的一个词项匹配,

        // 还可以设置为AND,表示所有查询词项都必须在文档中匹配才能返回

        .minimumShouldMatch("1%");//返回的文档需要匹配的最小子串数,"75%"表示至少需匹配查询中的75%的词项才会返回匹配的结果。可以设置不同的值,

        // 如"2"表示至少需匹配2个词项,"50%"表示至少需匹配查询的一半词项


        // 创建搜索源构建器
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(queryBuilder);

        // 创建搜索请求
        searchRequest.source(sourceBuilder);

        try {
            // 执行搜索并获取结果
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();

            // 遍历结果并输出
            for (SearchHit hit : hits.getHits()) {
                String id = hit.getId();

                System.out.println(id);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 关闭客户端
        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
复制代码
posted @   斌哥的小弟  阅读(359)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示