ES中精确查询被分词字段_es phrase_佳亮的博客-程序员宅基地

技术标签: ElasticSearch  精确查询  其他  分词  ES  

项目中,需要精确查询的一个ES字段,为text类型,text是要被分词的,整个字符串根据一定规则分解一个个term。因此一般情况下,text类型的字段,不能精确查询,keyword类型的可以使用termQuery查询。

这种情况下可以使用matchPhrasePrefixQuery(...)来精确查询被分词的字段,然后再过滤一次。

代码如下:

    public long countByaddress(String address) {
        /**
         * 对于matchPhrasePrefixQuery("address", address).slop(0)。
         * matchPhrasePrefixQuery表示短语查询。该短语会被分词产生一个词条列表。
         * slop(n)表示使用该词条列表查询时,包含该词条列表的内容但是每个词条相隔的其他词条个数为n。
         * slop(0)就是使用该词条列表 查询时,每个词条必须紧接在一起,是一个完整的短语,效果相当于不分词。
         *
         *
         * 但是,这种方式也无法实现精确查询,比如address为”宜兴埠红旗路北7号“,查询时,”北辰区宜兴埠红旗路北7号“
         * 也会被匹配,只要包含“宜兴埠红旗路北7号”的短语或者句子,都会被匹配。因此使用字符串比对的方式要再做一次过滤,才能实现分词后的精确查询

         *
         */
        MatchPhrasePrefixQueryBuilder queryBuilder=QueryBuilders.matchPhrasePrefixQuery("address", address).slop(0);
        //QueryBuilder queryBuilder = QueryBuilders.matchQuery("address", address);
        SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        String[] queryColumnArray = new String[]{"id","address","name"};
        searchSourceBuilder.fetchSource(queryColumnArray, null);
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(queryBuilder);
        searchSourceBuilder.query(boolQueryBuilder);
        searchRequest.source(searchSourceBuilder);
        SearchResponse response = null;
        try {
            response = esConfig.getClient().search(searchRequest);
        } catch (IOException e) {
            throw new RuntimeException("查询ES异常");
        }
        long count=0;
        for(SearchHit hit : response.getHits().getHits()){
            Map<String, Object> map = hit.getSourceAsMap();
            String entid = (String) map.get("entid");
            String address2 = (String) map.get("address");
            //也可以使用length判断
            if(address.equals(address2)){
                count++;
            }

        }
        return  count;
    }

上面的代码逻辑是查询有多少相同的地址。除了使用matchPhrasePrefixQuery(...),还需使用equals或者length再做一次过滤。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zahngjialiang/article/details/90409648

智能推荐

已 树莓派4b ros 系统 网盘_搭建简易私人网盘/基于树莓派4B和SMB协议搭建家用NAS 1/5..._weixin_39874196的博客-程序员宅基地

需求:家中各种设备比较杂,win10台式机,MacBookAir,Linux笔记本,Android手机,iPad等,希望能有个地方能让各种设备都可以共享文件。简而言之就是个家庭内网下的私人百度网盘。前言:解决上述需求已经有了很成熟的解决方案,群晖/威联通肯定比我下面的方案更稳定好用。如果你只是有和我类似的需求,嫌麻烦又对价格不敏感,出门左转京东下单不要犹豫。但如果你更享受解决问题的过程,想借机学点..._ros smb

砝码称重(dp)_Roly_Yu的博客-程序员宅基地

砝码称重内容:砝码称重(30分)设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重要求:输入方式:a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)输出方式:Total=N(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)如输入:1_1_0_0_0_0 (注:下划线表示空格)输出:TOTA_砝码称重

Plug and Play_18790970257的博客-程序员宅基地

http://baike.baidu.com/view/33701.htm即插即用编辑PNP是Plug-and-Play(即插即用)的缩写。它的作用是自动配置(低层)计算机中的板卡和其他设备,然后告诉对应的设备都做了什么。PnP的任务是把物理设备和软件(设备驱动程序)相配合,并操作设备,在每个设备和它的驱动程序之间建立通信信道。换种说法,PnP分配下列资源给设备...

JPA @Cache缓存_jpa entitymanager cache_-droidcoffee-的博客-程序员宅基地

先了解一下cache基础:一级缓存 Hibernate 的一级缓存是由 Session 提供的,因此它只存在于 Session 的生命周期中,当程序调用 save(),update(),saveorupdate() 等方法 及调用查询接口 list,filter,iterate 时,如 session 缓存中还不存在相应的对象, Hibernate 会把该对象加入到一级缓存中, 当 Session 关闭的时候该 Session 所管理的一级缓存也会立即被清除 _jpa entitymanager cache

为什么需要servlet映射?_为什么要设置映射路径_Silver gradient的博客-程序员宅基地

我们写的是Java程序,但是我们需要使用浏览器访问到,而浏览器需要连接到web服务器,所以我们需要在web服务器中注册我们写的servlet,并且给其一个浏览器能访问的路径;_为什么要设置映射路径

IT 技术学习资料分享_it学习内容分享_Andy Chen 陈郑游的博客-程序员宅基地

1、深入浅出Hadoop实战开发(升级版)链接:https://pan.baidu.com/s/1jIAahZg 密码:pin42、SpringBoot教程链接:https://pan.baidu.com/s/1cz1bNC密码:uiqd3、大数据高并发系统架构实战方案课程链接:https://pan.baidu.com/s/1boCacO3密码_it学习内容分享

随便推点

命令行删除空文件夹并按日期新建文件夹_for /f "delims=" %%a in_xiaoerbuyu1233的博客-程序员宅基地

@echo off::方式一,简化版本REM SET str="%date:~0,4%-%date:~5,2%-%date:~8,2%"REM md %str%::方式二,完整版本::SET str="%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%"::md %str%for /f "delims=" %%a in ('dir /ad /b /s D:\06tmp\^|sort /r') do (._for /f "delims=" %%a in

【Linux】ubuntu桌面版和服务器版之间的区别_ubuntu live server 区别_jn10010537的博客-程序员宅基地

ubuntu桌面版本和服务器版本之间的区别1、背景2、区别3、判定1、背景最近下载ubuntu18.04.5,官网:http://releases.ubuntu.com/18.04/可以看到有两个版本:桌面镜像和服务器镜像;那么这两个版本有什么区别呢?2、区别桌面版:安装了GUI图形界面的管理软件,便于用户操作。服务器版:没有安装GUI图形界面的管理软件,但安装一些网络服务软件。总结:在linux内核的基础上,安装了不同的软件。服务器版可以装上桌面变成桌面版;同理桌面版装上相关软件,_ubuntu live server 区别

Android ADB查看硬件Camera分辨率信息_adb查看摄像头信息_王睿丶的博客-程序员宅基地

第一步: △如果不打开是识别不到 video9 的打开 Camera第二步:_adb查看摄像头信息

分布式session共享 集群Session共享_走在小路的博客-程序员宅基地

最近,在工作中遇到一个问题,问题描述:一个用户在登录成功以后会把用户信息存储在session当中,这时session所在服务器为server1,那么用户在session失效之前如果再次使用app,那么可能会被路由到server2,这时问题来了,server2没有该用户的session,所以需要用户重新登录,这时的用户体验会非常不好,所以如何实现多台server之间共享session,让用户状态得以...

Ubuntu 安装 Anaconda3 亲测成功_如何验证自己ubuntu系统中的anaconda3安装好了_superboy@.的博客-程序员宅基地

目录Anaconda简介1.下载1.1 创建一个文件夹来存放安装包1.2 进入到文件夹里面:1.3 wget命令行下载:1.4 下载情况:2.开始安装:2.1 进入到存放文件的位置:2.2 运行 .sh 文件:2.3 进入注册信息页面,输入yes:2.4 阅读注册信息,然后输入yes;查看文件即将安装的位置,按enter,即可安装:2.5 进入安装过程:2.6 安装完成后,收到加入环境变量的提示信息,输入yes:2.7 看到这些信息..._如何验证自己ubuntu系统中的anaconda3安装好了

关于使用Jmeter进行性能压力测试报OOM的错误解决办法_jmeter oom_精致的灰i的博客-程序员宅基地

在使用Jmeter进行压测时间较长时可能会出现 java.lang.OutOfMemoryError:Java heap space 这样的报错。原因为:默认配置分配的堆内存不够大解决办法:1、首先找到jmeter的安装目录,进入到bin目录下。2、创建一个名称为:setenv.sh 的文件3、内容为export HEAP="-Xms4G -Xmx4G"注:由于每个机器的内存配置不一样,根据自己的需求修改参数配置,最好不要超过物理机内存的一半..._jmeter oom