一 常用查询
1.1 term查询
term关键字查询,精确匹配,不会对查询条件进行分词。
1.2 match查询
匹配查询,会将查询条件进行分词,然后进行查询,多个分词后查询的关系是or
elasticsearh中查询类型,term、match、match_all、multi_match、range、bool、boosting等_es match match_all_Leo Han的博客-CSDN博客
ElasticSearch 匹配查询(match、match_phrase)_鲨鱼辣椒1998的博客-CSDN博客
1.3 terms和term查询
1.3.1 term查询
term的查询是代表完全匹配,不会分词,类似于MySQL库的 where province = ?
1.3.2 terms查询
terms:是针对一个字段包含多个值时使用。
term类似于MySQL的 where province=?
terms类似于MySQL中的 where province in (?, ? ,?)
注意:term和terms只是说不会对关键字进行分词,并不是说只能用于keyword类型的字段查询。
如假设文档中有个字段是text类型,采用了ik分词器,name里面的值是【奋斗的时代】,通过ik分词器会分解成【奋斗,奋,斗,时代】但是如果你用该字段的term或者terms查询,输入的关键字是【奋斗的时代】,因为输入的关键字不会分词,反而查不到该记录,如果你输入的关键字是【奋斗】就是可以的。
https://www.cnblogs.com/chengbao/p/14974148.html
1.4 match_phrase查询
1.match_phrase会被分词
2.被检索字段必须包含match_phrase中的所有词项并且顺序必须是相同的
3.被检索字段包含的match_phrase中的词项之间不能有其他词项
1.5 wildcardQuery
1.5.1 创建索引和搜索索引
WildcardQuery即通配符查询,即使用通配符来模糊查询。
wildcard 关键字: 通配符查询
? 用来匹配一个任意字符
* 用来匹配多个任意字符
GET /products/_search { "query": { "wildcard": { "description": { "value": "iphon*" } } } } |
需要注意:
1.WildcardQuery对于用户输入的查询关键字是大小写敏感的,请不要使用大写形式,因为索引中的Term都是小写形式的,
2.WildcardQuery查询是很慢的,因为它需要遍历很多的Term,为了避免极慢的查询速度,请不要使用以星号开头的通配符进行查询。
3.在进行 wildcard 搜索的时候最好避免在检索词的开头使用*或者?,这会降低搜索性能。
Lucene5学习之WildcardQuery使用-WinFrom控件库|.net开源控件库|HZHControls官网
1.5.2 案例使用wildcard query
1.案例1: 搜索【01】
2.案例2:搜索【a】
1.6 fuzzyQuery
1.6.1 fuzzyQuery查询
fuzzy查询是一种模糊查询,会根据检索词和检索字段的编辑距离(Levenshtein Distance)来判断是否匹配。一些信息有对的也有错误的,它会利用这些大概的信息,给我们匹配信息出来;
fuzzy查询是修正纠错模糊查询。
一个编辑距离就是对单词进行一个字符的修改。如下场景
修改一个字符,比如 box 到 fox 删除一个字符,比如 black 到 lack 插入一个字符,比如 sic 到 sick 交换两个相邻的字符的位置,比如 act 到 cat |
在进行 fuzzy 搜索的时候,ES 会生成一系列的在特定编辑距离内的变形,然后返回这些变形的准确匹配。默认情况下,当检索词的长度在0..2 中间时,必须准确匹配;长度在3..5之间的时候,编辑距离最大为1;长度大于5的时候,最多允许编辑距离为2。
fuzzy关键字: 用来模糊查询含有指定关键字的文档
GET /products/_search { "query": { "fuzzy": { "description": "iphooone" } } } |
注意: fuzzy 模糊查询 最大模糊错误 必须在0-2之间
搜索关键词长度为 2 不允许存在模糊
搜索关键词长度为3-5 允许一次模糊
搜索关键词长度大于5 允许最大2模糊
好玩的ES--第二篇之高级查询,索引原理和分词器_es高级查询_Binary Oracle的博客-CSDN博客
1.6.2 fuzzyQuery查询API的参数
fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length 1.fuzziness:表示输入的关键字通过几次操作可以转变成为ES库里面的对应field的字段 操作是指:新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为1, 如【中文集团】到【中威集团】编辑距离就是1,只需要修改一个字符; 该参数默认值为0,即不开启模糊查询,精确匹配, 如果fuzziness值在这里设置成2,会把编辑距离为2的【东东集团】查询出来。 2.prefix_length:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配,不允许错别字匹配 如这里等于1,则表示开头的中字必须匹配,不匹配则不返回,默认值也是0 加大prefix_length的值可以提高效率和准确率。 注意:这两个参数不是只适用于fuzzy查询,match查询一样适用。 |
如图截图:fuzzy查询:
1.6.3 同一字段即可全文检索又可精确匹配查询
针对含有两种类型的结构:既可以分词查询又可以不分词查询。
基于这个映射你即可以在product字段上进行全文搜索, 也可以通过productName.keyword字段实现关键词搜索及数据聚合.
1.分词查询
2.不分词查询
想要不分词进行查询的时候,可以加上productName.keyword(字段名.keyword)进行查询,比如:
https://blog.csdn.net/sfh2018/article/details/118083634
https://www.cnblogs.com/lly001/p/11938953.html
1.7 query和filter的区别联系
Query查询字段会进行相关性_score计算;
filter仅仅是进行筛选。不计算相关性。
1.8 fuzzy和match查询的区别
使用fuzzy进行模糊查询时,value中的字段不会进行分词,而是作为一个整体进行匹配
使用match进行模糊查询时,value中的字段会被分词,分词后按照每个分词结果进行匹配
fuzzy是词/项级别的模糊匹配,match_phrase是基于短语级别的。
https://www.cnblogs.com/lyc-code/p/15891806.html
https://blog.csdn.net/weixin_39929377/article/details/111808583