es8 text类型使用term精确查询失效

这篇具有很好参考价值的文章主要介绍了es8 text类型使用term精确查询失效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:

在使用term精确查询text 类型时,比如phone 手机号数值时可以查询到,使用nickname 这种text 查询不到。

我的mapping 是这样的

es8 text类型使用term精确查询失效

 

es8 text类型使用term精确查询失效

 

解决:

1.通过es提供的测试分词的接口,我们可以测试各字段的分词情况

get http:/ip/索引名称/_analyze
 
{
"field":"firtname", #要进行分析的索引中的字段
"text":"DNF" #要进行分析的文本内容
}

es8 text类型使用term精确查询失效

分别分词为’北‘,京,大,学,并没有我想要的整体的一块的分词 “北京大学”。

2.ES 字段类型keyword和text的区别和选择

keyword:存储数据时候,不会分词建立索引
 
text:存储数据时候,会自动分词,并生成索引

创建es索引是最好先设置好每个字段的类型和使用的分词索引,如果不需要分词查询,设置字段类型为keyword最好,例如商品id、编号之类的;

如果需要分词查询,就设置为text类型,并且指定分词器,例如商品名称、商品标签、关键字等等;

设置字段类型和使用的分词器:

"fieldName": {
   "type": "text", #字段类型为text
   "analyzer":"ik_max_word" #ik中文分词器
}

注意:设置字段类型为text后,es建立的分词索引会把大写字母转换为小写,通过term精确匹配就匹配不到

结果:

后面我试着为content添加附属字段keyword,希望能够借此达到目的:

es8 text类型使用term精确查询失效

  $where = [
                /*"term" => [ //根据词条精确值查询
                    "_id" => ["value" => "42"]
                ]*/
                /*"range" => [
                    "birthday" => [
                        "gte" => '1989-03-31',  // 这里的gte代表大于等于,gt则代表大于
                        "lte" => '2095-03-31'  // lte代表小于等于,lt则代表小于
                    ]
                ]*/
                /*"match" => [ //单字段查询
                    "nickname" => "蓝红白"
                ],*/
                'bool' => [
                    'should' => [
//                        ["term" => ["_id" => '42']], //可以查询到
//                        ["term" => ["id" => '7']],//可以查询到
//                        ["term" => ["phone" => '18235555501']],//可以查询到
//                        ["term" => ["school_name" => '北京大学']],// 查不到
                        ["term" => ["school_name.keyword" => '北京大']],//可以查询到
                        ["term" => ["nickname.keyword" => '小白']],//可以查询到
                    ]
                ]
            ];

 ["term" => ["school_name.keyword" => '北京大']], 必须为“北京大学”,多一字少一字都匹配不到这就是精确匹配。

总结:

  1. 布尔查询: must:必须匹配每个子查询,类似“与”;  should:选择性匹配子查询,类似“或”;  must_not:必须不匹配,不参与算分,类似“非”;  filter:必须匹配,不参与算分
  2.  bool.must:适用于精确查询,并且如果使用多个term的话不能适用于同一个字段,多值而适用于多个字段
  3. match:根据一个字段查询,在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。
  4. multi_match: 提供在多个字段上查询,搜索字段越多,对查询性能影响越大,因此建议采用copy_to,然后单字段查询的方式
  5. erm结合bool使用时:should是或,must是与,must_not是非
  6. term:精准查询,根据词条精确值查询,keyword、数值类型、布尔类型、日期类型字段; range:根据值的范围查询,可以是数值、日期的范围
  7. geo_bounding_box:矩形范围查询,查询坐标落在某个矩形范围的所有文档,查询时,需要指定矩形的左上、右下两个点的坐标,然后画出一个矩形,落在该矩形内的都是符合条件的点。
  8. geo_distance:附近查询,也叫做距离查询,查询到指定中心点小于某个距离值的所有文档。在地图上找一个点作为圆心,以指定距离为半径,画一个圆,落在圆内的坐标都算符合条件

​https://blog.csdn.net/xcdsdf14545/article/details/106189972/
https://blog.csdn.net/Muscleheng/article/details/115380374文章来源地址https://www.toymoban.com/news/detail-410784.html

到了这里,关于es8 text类型使用term精确查询失效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES中如何对text字段进行精确匹配

    在实际使用ES过程中,经常会遇到这样的问题: 既需要对一个字段进行全文检索,又要对该字段进行等值查询。 我们知道全文检索的字段类型需要设置为text,但是text字段类型又不支持term等值查询。那么怎么解决这个问题呢? 答案是 通过fields进行多字段配置 为了不同的目的

    2024年02月06日
    浏览(36)
  • es笔记五之term-level的查询操作

    本文首发于公众号:Hunter后端 原文链接:es笔记五之term-level的查询操作 官方文档上写的是 term-level queries,表义为基于准确值的对文档的查询,可以理解为对 keyword 类型或者 text 类型分词为 keyword 的字段进行 term 形式的精确查找。 以下是本篇笔记目录: 是否存在值 前缀搜索

    2024年02月06日
    浏览(49)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(70)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(118)
  • 【ES】es查询term、match、match_phrase、mast_not、mast...

    keyword:不分词 非keyword:分词 对属性名.keyword,就是全值匹配。如果查询的属性是text,就会匹配分词。 term:查询的入参,不会分词。 terms:查询的入参,不会分词。 match:分词匹配 match_phrase:短语匹配,一个slop属性,可以使短语中的词,调换顺序 match_phrase_prefix:分词前缀

    2024年02月22日
    浏览(43)
  • es笔记三之term,match,match_phrase 等查询方法介绍

    本文首发于公众号:Hunter后端 原文链接:es笔记三之term,match,match_phrase 等查询方法介绍 首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text。 keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理 text 存储数据的时候会对字符串

    2024年02月05日
    浏览(53)
  • ES查询问题- Fielddata is disabled n text fields by default. Set fielddata=true on [XXXX]

    1、重点信息提炼          Fielddata is disabled n text fields by default. Set fielddata=true on [shopOperatorTime] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead 2、关于fielddata=true 这个参数可以在百度上面查看到对

    2024年02月13日
    浏览(42)
  • 【ES笔记02】ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)

    这篇文章,主要介绍ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。 目录 一、布尔查询 1.1、主键查询 1.2、两种查询方式 (1)路径参数查询 (2)请求体参数查询 1.3、match查询 (1)match (2)match_all 1.4、过滤字段 1.5、布

    2023年04月09日
    浏览(55)
  • 第七章-分布式搜索引擎-ES:全文查询、分词查询、精确查询、地理坐标查询、组合查询(bool、funtion_score)以及RestApi

    DSL查询分类 全文查询、分词查询、非分词查询、地理坐标查询、组合查询 match_all 查询所有,不需要查询条件,固定写法_search 第一个hits就是命中的数据 ,total就是条数,第二个hits是source嘞   全文检索查询 我们不要整多个字段查询,参与的字段越多,查询速度越慢,如果有

    2024年01月16日
    浏览(81)
  • ElasticSearch第二章(ES8.X的使用)

    目录 1:ES的使用(DSL创建索引库-相当于表) 1.1:什么是索引库 1.2:索引库的增删改查使用 2:ES的使用(DSL操作文档-相当于数据) 2.1:什么是文档 2.2:文档的增删改查 3:java代码开发 3.1:准备工作 3.2:代码操作索引(也就是表的增删改查) 3.3:代码操作文档(也就是数

    2024年03月23日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包