当前位置:   article > 正文

Elasticsearch模糊查询精讲_elasticsearch 模糊查询

elasticsearch 模糊查询

目录

一.3种模糊查询的区别 以及 常用的查询手段

1.wildcard

2.prefix

3.fuzzy 

4.exists query

二. terms_set(主要用于数组检索)

1.数据准备

2.minimum_should_match_field

3.minimum_should_match_script

4.terms_set与match query的比较

三.其他查询

1.regexp (使用正则表达式术语查询)

2.ids 

四.Elasticsearch Term-level queries(磁条级搜索)总结大全


学习目标:

1、wildcard、prefix、fuzzy这3种模糊查询的异同点是什么?

2、如何使用 terms_set检索Array类型的字段?

3、Term-level queries(磁条级搜索)总结大全

一.3种模糊查询的区别 以及 常用的查询手段

1.wildcard

查询包含通配符表达式字段的文档。【ps:等价于mysql 的 like 查询】

  1. 通配符 *:它匹配任何字符序列(包括空字符)
  2. 占位符 ?:它匹配任何单个字符。
  3. 说明:请注意,此查询的速度可能很慢,因为它需要迭代许多项。为了防止极慢的通配符查询,通配符术语不应以通配符*或?之一开头。

(1)通配符*

  1. GET /blogs_index/_search
  2. {
  3. "query": {
  4. "wildcard" : { "author": "方*" }
  5. }
  6. }

上述DSL语句,可以检索到所有文档。等价于sql【where author like "方%”】

(2)占位符?

  1. GET /blogs_index/_search
  2. {
  3. "query": {
  4. "wildcard" : { "author": "方?" }
  5. }
  6. }

上述DSL语句,检索结果为空。等价于sql【where author like "方_”】

2.prefix

查找指定字段包含以指定确切前缀开头的术语的文档。

  1. GET /_search
  2. { "query": {
  3. "prefix" : { "author": "方" }
  4. }
  5. }

该DSL等价于 wildcard query 的 "wildcard" : { "author": "方*" },等价于sql【where author like "方%”】

3.fuzzy 

模糊查询使用基于Levenshtein编辑距离的相似度。是一种误拼写时的fuzzy模糊搜索技术,用于搜索的时候可能输入的文本会出现误拼写的情况。

比如输入"方财兄",这时候也要匹配到“方才兄”

  1. GET /blogs_index/_search
  2. {
  3. "query": {
  4. "fuzzy" : {
  5. "author": {
  6. "value": "方财兄",
  7. "fuzziness": 1,
  8. "prefix_length": 1,
  9. "max_expansions": 100
  10. }
  11. }
  12. }
  13. }
  1. fuzziness:最大编辑距离【一个字符串要与另一个字符串相同必须更改的一个字符数】。默认为AUTO。
  2. prefix_length:不会被“模糊化”的初始字符数。这有助于减少必须检查的术语数量。默认为0
  3. max_expansions:fuzzy查询将扩展到的最大术语数。默认为50
  4. transpositions:是否支持模糊转置(ab→ ba)。默认值为false


上述DSL等价于sql【

where author like “方_兄”or author like “方财_”or author like “方_财兄”or author like “方财_兄”or author like “方财兄_”

会根据上述的4个参数穷尽所有可能组合。

  1. 注意:如果prefix_length将设置为0,并且max_expansions将设置为很高的数字,
  2. 则此查询可能会很繁琐。这可能会导致索引中的每一项都受到检查!

4.exists query

(1)查找指定字段包含任何非空值【不是null 也不是[ ]】的文档。【ps:等价于mysql 的 is null】

注意:这些值不属于空值

  1. 1、空字符串,例如"""-"
  2. 2、包含null和另一个值的数组,例如[null, "foo"]
  3. 3、自定义null-value,在字段映射中定义
  1. 1、查询 title字段不为 null 的文档
  2. GET /blogs_index/_search
  3. {
  4. "query": {
  5. "exists" : { "field" : "title" }
  6. }
  7. }

(2)查询为null的字段,应该使用:must_not + exists

  1. 2、查询 title字段为 null 的文档
  2. GET /blogs_index/_search
  3. {
  4. "query": {
  5. "bool": {
  6. "must_not": {
  7. "exists": {
  8. "field": "title"
  9. }
  10. }
  11. }
  12. }
  13. }

二. terms_set(主要用于数组检索)

返回的文档至少匹配一个或多个检索的术语。这些术语未进行分析,因此必须完全匹配。每个文档中必须匹配的术语数会有所不同,并由“最小匹配项”字段控制,或者由“最小匹配项”脚本中的每个文档计算。

  1. 说明:
  2. 1.terms_set query 在对Array类型的字段做检索时非常有用,特别是对于每个文档,
  3. 需要匹配的数量不一致时。如果所有文档需要匹配的数量一致,可以使用match query替代。
  4. 2.控制必须匹配术语的数量的字段必须是数字字段

1.数据准备

  1. PUT /term_set_index
  2. {
  3. "mappings": {
  4. "_doc": {
  5. "properties": {
  6. "codes": {
  7. "type": "keyword"
  8. },
  9. "required_matches": {
  10. "type": "integer"
  11. }
  12. }
  13. }
  14. }
  15. }
  16. PUT /term_set_index/_doc/1?refresh
  17. {
  18. "codes": ["系统学习", "es","关注我"],
  19. "required_matches": 2
  20. }
  21. PUT /term_set_index/_doc/2?refresh
  22. {
  23. "codes": ["系统", "学习"],
  24. "required_matches": 1
  25. }

2.minimum_should_match_field

  1. GET /term_set_index/_search
  2. {
  3. "query": {
  4. "terms_set": {
  5. "codes": {
  6. "terms": [
  7. "关注我",
  8. "学习"
  9. ],
  10. "minimum_should_match_field": "required_matches"
  11. }
  12. }
  13. }
  14. }

3.minimum_should_match_script

  1. GET /term_set_index/_search
  2. {
  3. "query": {
  4. "terms_set": {
  5. "codes": {
  6. "terms": [
  7. "系统学习",
  8. "关注我"
  9. ],
  10. "minimum_should_match_script": {
  11. "source": " doc['required_matches'].value"
  12. }
  13. }
  14. }
  15. }
  16. }

上2、3 的dsl是等价的关系,搜索结果如下:

可以检索到文档2。对于文档1,需要至少匹配2个term,但是在检索terms里,只能匹配上【关注我】一个term,所以文档1不符合检索条件;对于文档2,只需要匹配一个term,刚好能匹配上检索terms里的【学习】。

4.terms_set与match query的比较

当每个文档的required_matches值都相同时,上述两句DSL与下面的match query 语句检索效果完全一致:

  1. GET /term_set_index/_search
  2. {
  3. "query": {
  4. "match": {
  5. "codes" : {
  6. "query": "系统学习 关注我",
  7. "analyzer": "whitespace",
  8. "minimum_should_match": 2
  9. }
  10. }
  11. }
  12. }
  1. 分析:DSL语句使用 "analyzer": "whitespace",
  2. 所以 query会被分词两个Token/term【系统学习】【关注我】。
  3. "minimum_should_match": 2,所以可以检索到文档1

三.其他查询

1.regexp (使用正则表达式术语查询)

  1. GET /_search
  2. {
  3. "query": {
  4. "regexp":{
  5. "name.first": "s.*y"
  6. }
  7. }
  8. }

注意:regexp查询的性能在很大程度上取决于所选的正则表达式。匹配所有类似的东西.*都很慢,而且使用环视正则表达式也很慢。如果可能,应在正则表达式开始之前尝试使用长前缀。

2.ids 

根据index的_id 字段检索文档

  1. GET /_search
  2. {
  3. "query": {
  4. "ids" : {
  5. "type" : "_doc",
  6. "values" : ["1", "4", "100"]
  7. }
  8. }
  9. }

四.Elasticsearch Term-level queries(磁条级搜索)总结大全

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/882638
推荐阅读
相关标签
  

闽ICP备14008679号