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

问题:

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

我的mapping 是这样的

解决:

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

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

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

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

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

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

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

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

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

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

结果:

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

  $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

猜你喜欢

转载自blog.csdn.net/lxw1844912514/article/details/130090582