Elasticsearch 基本使用(三)条件查询

这篇具有很好参考价值的文章主要介绍了Elasticsearch 基本使用(三)条件查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单查询

term

单词查询

  • 对于不分词的字段(数组视同普通字段,查询数组字段时,只要匹配上一项就算匹配)条件直接匹配字段值
  • 对于分词的字段;在字段倒排索引表,仅限分词结果内查找条件值

terms

同样是单词查询;但条件值可以是多个值,效果为 term1 or term2
should : [
{term1…}, {term2…}
]

range

数值范围查询

"range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }

match

match 匹配字段,会对条件分词,然后每个词以or的关系在文档倒排索引内进行查询
match:对于不分词的字段直接匹配值;
对于分词的字段,先进行分词得到词典,然后对词典执行tern的组合(or 或 and,默认为 or )

GET bank/_search
{
  "query": {
    "match": {
      "address": "244 Columbus Place"
    },
    "match": {
      "name": {
        "query": "条件值",
        "operator": "and/or"
      }
    }
  }
}

可以看到
Elasticsearch 基本使用(三)条件查询
上面两条数据的 address 的相同点就是 都有244。

debug 查看分词结果

GET _analyze
{
  "text": ["244 Columbus Place"]
}

# res 可以看到,拆分成了 244,columbus,place;
# 实际查询条件为 244 or columbus or place
{
  "tokens" : [
    {
      "token" : "244",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "<NUM>",
      "position" : 0
    },
    {
      "token" : "columbus",
      "start_offset" : 4,
      "end_offset" : 12,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "place",
      "start_offset" : 13,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}

match_phrase

不对条件值分词,直接拿到文档里面找;只要能找到这个完整的关键词就能匹配。
文档字段包含这个词就能匹配
查询连续的多个完整词

GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "244 Columbus Place"
    }
  }
}

# 可以看到,只查询到一条数据
{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 14.199377,
    "hits" : [
      {
        "_index" : "bank",
        "_type" : "_doc",
        "_id" : "0",
        "_score" : 14.199377,
        "_source" : {
          "account_number" : 0,
          "balance" : 16623,
          "firstname" : "Bradshaw",
          "lastname" : "Mckenzie",
          "age" : 29,
          "gender" : "F",
          "address" : "244 Columbus Place",
          "employer" : "Euron",
          "email" : "bradshawmckenzie@euron.com",
          "city" : "Hobucken",
          "state" : "CO"
        }
      }
    ]
  }
}

match_phrase_prefix

查询多个连续的词(term),最后一个词 以 prefix 查询
举例:name = my name is tony
查询条件值为 my n
match_phrase 查不到数据,因为 n 没有在字段分词找到对应的词
match_phrase_prefix 能查到数据,最后一个条件 值为 n,对n执行前缀查询,所以能查到

match_bool_prefix

条件分词后,前面的词以 term 查询,最后一个以 prefix 查询

should [
term: 条件分词1,
term: 条件分词2,
prefix:最后一个条件词
]

multi_match

友视需要在多个字段上查询相同条件。比如搜索商品关键词,既可以在商品名称上匹配,也可以在品牌名称上匹配

"multi_match": {
  "query": "条件值",
  "fields": ["goods_name", "brand"]
}

复合查询

在实际使用中,往往是在多个条件下查询数据。

bool 查询

query 下使用 bool 聚合多条件,通过组合内部多个条件的逻辑关系,形成最终的查询条件。
bool 内部 must ,must_not,filter,should 之间为与的关系

以下查询条件为:

  • address 分词匹配 244 Columbus Plac age = 29
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "244 Columbus Place"
          }
        },
        {
          "match": {
            "age": 29
          }
        }        
      ]      
    }    
  }
}
标记数据匹配的条件

查询结果还可以标记当前记录,匹配上了哪些条件
在查询中,指定查询条件值时:
_name标记当前条件
实际测试下来,不同查询方式,写法还不太一样

  • term
"term": {
  "age": {
    "value": "30",
    "_name": "age"
  }
}
  • terms
"terms": {
  "age": ["30"],
  "_name": "age"
}
  • match
"match": {
  "name": { 字段名
    "query": "四",
    "_name": "name"
  }
}

Elasticsearch 基本使用(三)条件查询
可以看到最后有一个 matched_queries字段,说明本条记录是匹配了哪些条件。
但是,这个机制好像对嵌套查询没效果,后续有机会再了解

bool 子元素区别
  • must: 与 (内部做与运算)
  • must_not:非(内部做 与 运算,最后在外层做非运算)不进行相关性评分,不影响整体评分
  • should:或 (内部做 或运算)
  • filter 过滤器,单纯过滤,先于 上述条件执。,不进行相关性评分,不影响整体评分,会使用过滤器缓存。速度更快。
    每个元素内部,还可以嵌套复杂条件(再来一层bool)

boosting 查询(人为降低指定条件得分)

在bool查询中,我们的查询结果是将 bool 内部的所有条件做 与运算
所有都匹配的数据会查出来,并根据相关性进行计分,默认倒序排列。
boosting 查询,则是
先根据 positive下的条件查询结果并得出一个初始评分,
再根据negative 下的条件匹配查询结果,如果匹配上了,则再根据negative_boost的值对其进行降分的处理,使其排名降低。

# boosting 查询
GET /stu/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match_phrase": {
            "name": {
              "query": "张三",
              "_name": "name"
            }
          }
      },
      "negative": {
        "term": {
            "age": {
              "value": "30",
              "_name": "age"
            }
          }
      },
      "negative_boost": 0.2
    }
  }
}

简单总结,就是 以 positive 查询数据,再以 negative + negative_boost 对结果降分

constant_score 查询(固定得分)

普通的查询相关性分数是es根据相关性确定的,在此基础上,我们可以通过boosting查询降低匹配特定指标的分数。
还有一种,我们可以返回固定分数。
通过前面的学习,我们知道在 bool 查询中 filter 和 must_not 是不计算分数的;因此 constant_score查询其实就是通过 filter查询,然后为其指定固定分数实现。

# constant_score 查询
GET /stu/_search
{
  "query": {
    "constant_score": {
      "filter": { # 查询条件
        "term": {
          "age": "30"
        }
      },
      "boost": 1.2 # 固定分数
    }
  }
}

dis_max 查询(单条件 最高分)

其他查询,最终得分是由所有query综合得分构成。
而dis_max 查询只取评分最高的那一项查询,而忽略其他条件的评分
以下条件查询 name 匹配 张三 或者 hobbies 包含 book 的用户

GET /stu/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "hobbies": "book"
          }
        }
      ]
    }
  }
}

得到以下得分

    "hits" : [
      {
        "_index" : "stu",
        "_type" : "_doc",
        "_id" : "jToE7YgBKFUjhQBivmyC",
        "_score" : 0.9983525,
        "_source" : {
          "id" : 1,
          "name" : "张三",
          "age" : 10,
          "hobbies" : [
            "swimming",
            "walk",
            "drive"
          ],
          "address" : [
            {
              "province" : "500",
              "city" : "023",
              "county" : "1991"
            },
            {
              "province" : "501",
              "city" : "024",
              "county" : "1992"
            }
          ]
        }
      },
      {
        "_index" : "stu",
        "_type" : "_doc",
        "_id" : "jzoE7YgBKFUjhQBi_2zu",
        "_score" : 0.9808291,
        "_source" : {
          "id" : 3,
          "name" : "张三四",
          "age" : 30,
          "hobbies" : [
            "movie",
            "book",
            "swimming"
          ],
          "address" : [
            {
              "province" : "600",
              "city" : "021",
              "county" : "1887"
            },
            {
              "province" : "601",
              "city" : "073",
              "county" : "1953"
            }
          ]
        }
      }
    ]
条件 得分
张三_name 0.9983525
张三_hobbies 0
张三四_name 0.8416345
张三四_hobbies 0.9808291

可以看到,第一条记录虽然只匹配上了 name = 张三,但是它的得分是 0.9983525,
而第二条记录虽然匹配上了两个条件 ,但是单算 name = 张三四 的评分只有 0.8416345,而 单算 hobbies 含有 book 的得分为 0.9808291,因此第二条记录采用了 较高匹配度的 hobbies 的得分。
总体算下来,低于第一条

算上其他 query 的得分

只使用 dis_max 会完全忽略其他query条件的得分,可能导致最终结果,不准确;因此,我们可以算上其他query的得分。
通过 参数 tie_breaker 来指定其他query得分的缩小比例,取值范围 [0, 1],当这个值为1时,其效果了 bool 查询一致。

这里我们将缩小比例设置为0.7,再看看查询的结果

GET /stu/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "hobbies": "book"
          }
        }
      ],
      "tie_breaker": 0.7
    }
  }
}

Elasticsearch 基本使用(三)条件查询
可以看到,张三四 在 hobbies 的基础之上,加上 name 的分数已经超越了 张三。
再结合上面表格单项得分,“tie_breaker”: 0.7
张三得分 = 0.9983525 + 0 = 0.9983525
张三四得分 = 0.9808291 + 0.8416345 * 0.7 = 1.56997325
与上图相符。

function_score 查询

使用函数自定义评分逻辑;可以使用内置函数或脚本完全自定义评分逻辑。
内置函数

  • weight 对当前分值做 乘法,实现 增加或减少
  • random_score :生成随机分数
  • field_value_factor :将文档指定字段(数值或者可转化为数值)纳入得分计算。
  • 衰减函数 - linear,exp,gauss 等
  • script_score 使用脚本,完全自定义评分逻辑

我们还可以使用 functions 为不同匹配条件指定不同的计分逻辑;匹配上了执行对应的计分逻辑,未匹配上的得1分,未匹配上的数据也会展示出来
functions 外面的查询及其评分只展示匹配上的数据;如果外面没有过滤,只在 functions 内进行查询和评分,那么评分逻辑只作用于匹配上的数据,未匹配上的数据统统1分
自定义函数有个计分计算方式字段 “boost_mode”: “multiply” 默认是乘法(weight及field 方式都是乘以现有分数)。
Elasticsearch 基本使用(三)条件查询

weight 成倍增减现有得分
GET /stu/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "张三"
        }
      },
      "weight": 0.5,
      "boost_mode": "multiply"
    }
  }
}

两条数据
Elasticsearch 基本使用(三)条件查询

random_score 随机得分
GET /stu/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "张三"
        }
      },
      "random_score": {}
    }
  }
}

两条数据,随机得分
Elasticsearch 基本使用(三)条件查询

指定字段(数值或者可转为数值)纳入计分
GET /stu/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "张三"
        }
      },
      "field_value_factor": {
        "field": "age"
      }
    }
  }
}

以下得分 = 现有得分 * 字段值 (age)* 比例(factor 默认为1) = 0.9983525 * 30 * 1 = 25.249035
Elasticsearch 基本使用(三)条件查询

自定义脚本得分

使用脚本完全自定义得分逻辑

直接以age为得分

script_score.script :指定得分计算方式,直接取 age 的值
boost_mode:replace;默认是 multiply,还是与age做乘法;使用replace,则是直接替换原有的分数而不做乘法。

# 直接以age得分
GET /stu/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "张三"
        }
      },
      "script_score": {
        "script": "doc['age'].value"
      },
      "boost_mode": "replace"
    }
  }
}

因此得到分数分别为二者的 age
Elasticsearch 基本使用(三)条件查询文章来源地址https://www.toymoban.com/news/detail-501578.html

到了这里,关于Elasticsearch 基本使用(三)条件查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot中进行elasticSearch查询,使用QueryBuilders构建各类条件查询

    BoolQueryBuilder对象使用must方法build,多个and使用多个must BoolQueryBuilder对象使用should方法build,多个or使用多个should使用 本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。 首发链接:https://www.cnblogs.com/lingyejun/p/17557467.html

    2024年02月16日
    浏览(23)
  • SpringBoot+Elasticsearch使用resthighlevelclient对象查询条件为“且+或”

    查询年龄为15或者16或者17或者18的且班级为1班的学生信息 首先,确保您的项目中包含了 Elasticsearch 的依赖: 然后,您可以创建一个包含查询逻辑的服务类。假设您有一个名为 StudentService 的服务类: 在上述代码中,您需要替换 your_index_name 为实际的 Elasticsearch 索引名称,并根

    2024年01月25日
    浏览(34)
  • sql语句转为es查询条件(elasticsearch-sql使用)

    github源码地址: https://gitee.com/weiyxiong_admin/elasticsearch-sql/blob/master/src/test/java/org/nlpcn/es4sql/ExplainTest.java 1、添加pom.xml依赖 2、scala 将sql转为es查询json语句 3、测试 4、查询返回结果展示(即步骤三esJSON结果打印) 5、打开postman

    2024年02月13日
    浏览(39)
  • ES简单教程(四)使用ElasticsearchRestTemplate多条件分页查询(复杂版)

    TIPS :本文实现类似数据库后台管理系统的多条件分页查询。

    2024年02月11日
    浏览(36)
  • Elasticsearch 基本使用(四)聚合查询

    说到聚合查询,马上会想到 SQL 中的 group by,ES中也有类似的功能,名叫 Aggregation。 统计分组后的数量 按年龄分组,然后统计每个年龄人数 count(*) ,age xxx group by age 非文档字段分组 文档字段分组 直接使用文档字段分组会报错。 ES没有对文本字段聚合,排序等操作优化;如果对

    2024年02月12日
    浏览(35)
  • elasticsearch之多条件查询

    字段名:用于指定要搜索的字段名称。例如, message 字段。 值:用于指定要搜索的值。例如, error 。 运算符:用于指定如何比较字段和值之间的关系。例如, : 表示相等, 表示大于, 表示小于, = 表示大于等于, = 表示小于等于, != 表示不等于, AND 表示逻辑与, OR 表示

    2024年04月13日
    浏览(19)
  • 【ElasticSearch教程】--- Elasticsearch文档多条件查询(十二)

    查询的body体的查询不能在使用 match 了,而需要使用, bool 然后要多个条件同时成立,接下来要填入 must ,多个条件用数组。body样例如下: 以上看起来就相当于是单条件要一样的效果。然后我们再加一个条件。如下: 返回结果: 返回结果就同时满足了 \\\"category\\\":\\\"床上用

    2024年02月11日
    浏览(35)
  • [大数据][elasticsearch]使用curl进行的简单查询

    curl:  -X :指定http的请求方式,有HEAD、GET、POST、PUT、DELETE  -d :指定要传输的数据  -H :指定http的请求头信息 curl -XPUT http://ip:port/索引名?pretty-- 创建索引 curl -XGET http://ip:port/_cat/indices?v --查看当前es的所有索引信息 curl -XGET http://ip:port/索引名?pretty  --查看单个索引信息 curl -XDE

    2024年02月11日
    浏览(49)
  • ElasticSearch多条件复杂查询实现

    前面实现方式和但条件一致 查询代码区别如下 注释里面标注了或者和and那两行的区别 网站链接 elasticsearch(ES)在SpringBoot中的复杂查询(多条件分页查询以及聚合查询)_尺规作图的博客-CSDN博客_springboot 整合es多条件

    2024年02月04日
    浏览(34)
  • elasticsearch 跨索引联合多条件查询

    Elasticsearch 是一个免费且开放的分布式搜索和分析引擎。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组

    2023年04月09日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包