elasticsearch match模糊查询

本文介绍如何使用Python查询Elasticsearch自定义字段,并深入探讨了term与match查询的区别,帮助读者理解精确与模糊查询的场景应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

python查询自定义字段:

elasticsearch 中term与match区别


python查询自定义字段:

import json

from elasticsearch import Elasticsearch

es = Elasticsearch(['192.168.55.90:9200'])


source_arr = ["frontFileName",
                  "uri",
                  "_id",
                  "deviceId",
                  "photo.capturenum",
                  "fileName","flag"]

res = es.search(index="ccat1",doc_type='demo0', body={"_source": source_arr,"query":  {"bool": {
   "must": {
    "wildcard": {
     "fileName.keyword": "0719_020314_631578*"
    }}}
   }})
# query = {'query': {'match_all': {}}}# 查找所有文档
for data in res["hits"]["hits"]:
    print(data["_id"],data["_source"])

elasticsearch 中term与match区别

elasticsearch 中term与match区别

term是精确查询

match是模糊查询

term查询

term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个。比如说我们要找标题为北京奥运的所有文档

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query":{
    "term":{
        "title":"北京奥运"
    }
  }
}'

将会得到如下结果

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": 0.92055845,
    "hits": [
     {
        "_index": "index",
        "_type": "doc",
        "_id": "3",
        "_score": 0.92055845,
        "_source": {
           "content": "同一个世界同一个梦想",
           "title": "北京奥运",
           "tags": [
               "和平"
            ]
        }
      }
    ]
  }
}

match类查询

match查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配,因此相比于term的精确搜索,match是分词匹配搜索,match搜索还有两个相似功能的变种,一个是match_phrase,一个是multi_match,接下来详细介绍一下

match

前面提到match搜索会先对搜索词进行分词,对于最基本的match搜索来说,只要搜索词的分词集合中的一个或多个存在于文档中即可,例如,当我们搜索中国杭州,搜索词会先分词为中国杭州,只要文档中包含搜索杭州任意一个词,都会被搜索到

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match": {
            "content": "中国杭州"
        }
    }
}'

文档3正文中有杭州,文档2中有中国,因此搜索结果有两个,文档3中杭州出现两次,所以排在前面,结果如下:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
      "total" : 2,
      "max_score" : 0.99999994,
      "hits" : [ {
            "_index" : "index",
            "_type" : "doc",
            "_id" : "4",
            "_score" : 0.99999994,
            "_source" : {
                 "content" : "杭州是一个美丽的城市,欢迎来到杭州",
                "title" : "宣传",
                "tags" : [ "旅游", "城市" ]
            }
       }, {
            "_index" : "index",
            "_type" : "doc",
            "_id" : "2",
            "_score" : 0.8838835,
            "_source" : {
                  "content" : "中国是世界上人口最多的国家",
                  "title" : "中国",
                  "tags" : [ "中国", "人口" ]
            }
       } ]
    }
}
### Elasticsearch 中模糊查询 `fuzzy` 的用法 在Elasticsearch中,模糊匹配查询允许通过编辑距离(Levenshtein Distance)来查找相似的词条。这对于处理拼写错误或变体词特别有用。 #### 基本语法 为了实现模糊匹配,可以在字段名称后面加上`.fuzzy`参数或者直接指定`fuzziness`选项。下面是一个简单的例子: ```json { "query": { "match": { "title": { "query": "quik brwn fox", "fuzziness": "AUTO" } } } } ``` 此请求会尝试找到与输入字符串接近的结果,即使存在少量字符差异也能够成功检索[^1]。 #### 配置参数说明 - **`fuzziness`**: 定义了允许的最大编辑距离,默认情况下设置为0意味着完全精确;也可以设成其他数值如1、2表示最多允许一次两次修改;还可以采用特殊值`AUTO`让引擎自动决定合适的范围。 - **`prefix_length`**: 设置前缀长度,在这个位置之前的字母必须严格一致才能算作候选对象。比如当设定为3时,则只有开头三个字符相同的词语才会参与比较。 - **`max_expansions`**: 控制最大扩展数量,即考虑多少种可能的变化形式作为潜在命中项。 - **`rewrite`**: 指定如何重写多条款子句以优化性能,可选值包括constant_score布尔模式等不同策略。 #### 实际应用案例 假设有一个文档索引存储了大量的书籍信息,并希望基于书名进行近似搜索: ```json POST /books/_search { "query": { "bool": { "must": [ { "multi_match": { "query": "harry pottor", "fields": ["title"], "type": "best_fields", "operator": "and", "fuzziness": "AUTO", "prefix_length": 2, "max_expansions": 50 } } ] } } } ``` 这段代码试图寻找标题中含有“Harry Potter”的记录,即便用户误打了“pottor”。这里使用了更复杂的组合方式——`multi_match`配合多个配置项一起工作,从而提高了召回率并保持较高的准确性[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值