`

elasticsearch 查询(match和term)

 
阅读更多

es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
由于DSL查询更为直观也更为简易,所以大都使用这种方式。
DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。
这里有一个地方注意的是官方文档里面给的例子的json结构只是一部分,并不是可以直接黏贴复制进去使用的。一般要在外面加个query为key的机构。

match

最简单的一个match例子:

查询和"我的宝马多少马力"这个查询语句匹配的文档。

{
  "query": {
    "match": {
        "content" : {
            "query" : "我的宝马多少马力"
        }
    }
  }
}

上面的查询匹配就会进行分词,比如"宝马多少马力"会被分词为"宝马 多少 马力", 所有有关"宝马 多少 马力", 那么所有包含这三个词中的一个或多个的文档就会被搜索出来。
并且根据lucene的评分机制(TF/IDF)来进行评分。

match_phrase

比如上面一个例子,一个文档"我的保时捷马力不错"也会被搜索出来,那么想要精确匹配所有同时包含"宝马 多少 马力"的文档怎么做?就要使用 match_phrase 了

{
  "query": {
    "match_phrase": {
        "content" : {
            "query" : "我的宝马多少马力"
        }
    }
  }
}

完全匹配可能比较严,我们会希望有个可调节因子,少匹配一个也满足,那就需要使用到slop。

{
  "query": {
    "match_phrase": {
        "content" : {
            "query" : "我的宝马多少马力",
            "slop" : 1
        }
    }
  }
}

multi_match

如果我们希望两个字段进行匹配,其中一个字段有这个文档就满足的话,使用multi_match

{
  "query": {
    "multi_match": {
        "query" : "我的宝马多少马力",
        "fields" : ["title", "content"]
    }
  }
}

但是multi_match就涉及到匹配评分的问题了。

我们希望完全匹配的文档占的评分比较高,则需要使用best_fields

{
  "query": {
    "multi_match": {
      "query": "我的宝马发动机多少",
      "type": "best_fields",
      "fields": [
        "tag",
        "content"
      ],
      "tie_breaker": 0.3
    }
  }
}

意思就是完全匹配"宝马 发动机"的文档评分会比较靠前,如果只匹配宝马的文档评分乘以0.3的系数

我们希望越多字段匹配的文档评分越高,就要使用most_fields

{
  "query": {
    "multi_match": {
      "query": "我的宝马发动机多少",
      "type": "most_fields",
      "fields": [
        "tag",
        "content"
      ]
    }
  }
}

我们会希望这个词条的分词词汇是分配到不同字段中的,那么就使用cross_fields

{
  "query": {
    "multi_match": {
      "query": "我的宝马发动机多少",
      "type": "cross_fields",
      "fields": [
        "tag",
        "content"
      ]
    }
  }
}

term

term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

{
  "query": {
    "term": {
      "content": "汽车保养"
    }
  }
}

查出的所有文档都包含"汽车保养"这个词组的词汇。

使用term要确定的是这个字段是否“被分析”(analyzed),默认的字符串是被分析的。

拿官网上的例子举例:

mapping是这样的:

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "full_text": {
          "type":  "string"
        },
        "exact_value": {
          "type":  "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

PUT my_index/my_type/1
{
  "full_text":   "Quick Foxes!",
  "exact_value": "Quick Foxes!"  
}

其中的full_text是被分析过的,所以full_text的索引中存的就是[quick, foxes],而extra_value中存的是[Quick Foxes!]。

那下面的几个请求:

GET my_index/my_type/_search
{
  "query": {
    "term": {
      "exact_value": "Quick Foxes!"
    }
  }
}

请求的出数据,因为完全匹配

GET my_index/my_type/_search
{
  "query": {
    "term": {
      "full_text": "Quick Foxes!"
    }
  }
}

请求不出数据的,因为full_text分词后的结果中没有[Quick Foxes!]这个分词。

bool联合查询: must,should,must_not

如果我们想要请求"content中带宝马,但是tag中不带宝马"这样类似的需求,就需要用到bool联合查询。
联合查询就会使用到must,should,must_not三种关键词。

这三个可以这么理解

  • must: 文档必须完全匹配条件
  • should: should下面会带一个以上的条件,至少满足一个条件,这个文档就符合should
  • must_not: 文档必须不匹配条件

比如上面那个需求:

{
  "query": {
    "bool": {
      "must": {
        "term": {
          "content": "宝马"
        }
      },
      "must_not": {
        "term": {
          "tags": "宝马"
        }
      }
    }
  }
}
分享到:
评论

相关推荐

    elasticsearch中term与match的区别讲解

    在Elasticsearch中,Term查询和Match查询是两种常见的全文检索方式,它们在处理搜索条件时有着明显的区别。 Term查询(Term Query)是Elasticsearch中的精确匹配查询。当你使用Term查询时,它会查找完全匹配指定...

    elasticsearch5基于term+bool实现的multiword

    总结来说,Elasticsearch的`match`查询在内部使用了`bool`和`term`查询的组合,通过调整`should`、`must`子句以及`minimum_should_match`参数,可以灵活地控制搜索的精确度和召回率,从而满足不同的搜索需求。...

    wuzhc#zcnote#elasticsearch系列4-term查询1

    为了配合本文的讲解,我们先导入一批数据match和term有什么区别使用match搜索文本时,es会先将文本进行分词,然后将分词后多个关键字再去搜索,而term

    对ElasticsearchPHP进行查询语句封装可实现链式调用方便es查询

    1. **Elasticsearch查询语句**:Elasticsearch支持丰富的查询语法,如match查询、term查询、range查询、bool组合查询等。封装查询语句意味着将这些复杂的查询结构转换为易于理解和使用的API。 2. **链式调用**:这...

    ElasticSearch查询语句

    **Match 查询**是 ElasticSearch 中最基本的全文检索方式,它能够根据指定字段中的文本内容进行模糊匹配。例如: ```json GET /blog/blog/_search { "query": { "match": { "summary": "title1" } }, "sort":...

    Elasticsearch查询API

    【Elasticsearch查询API】是Elasticsearch中用于检索数据的核心功能,允许用户通过各种查询语句和过滤条件从索引中获取相关文档。本文将详细介绍Elasticsearch接口API的使用,特别是全文检索、查询匹配以及常用的...

    elasticsearch安装和使用

    Elasticsearch是一个开源的全文搜索引擎,它以其高效、可扩展的特性被广泛应用于数据分析、日志分析、网站搜索等领域。...通过理解Term和Match查询的区别,可以更好地利用Elasticsearch进行文本检索,优化搜索效果。

    es基本查询,query match term bool should ,and ,put ,post等操作

    es基本查询,query match term bool should ,and ,put ,post等操作

    ElasticSearch常用查询的Java实现

    ElasticSearch查询term,terms,match,id查询 ElasticSearch查询refix,fuzzy,wildcard,range,regexp查询 ElasticSearch查询scroll,delete-by-query,bool,boosting,filter,highlight查询 ElasticSearch查询...

    ElasticSearch Java API 中文文档

    详细介绍了ElasticSearch的查询语言(Domain Specific Language),包括全量查询(Match All Query)、全文查询(Full Text Queries)、词项级查询(Term level queries)、复合查询(Compound queries)、连接查询...

    elasticsearch-head 可视化界面

    3. **开发调试**:在开发过程中测试索引和查询逻辑。 4. **培训教育**:向初学者展示Elasticsearch的工作原理和操作方式。 ### 注意事项 1. **版本兼容性**:确保Elasticsearch-Head版本与运行的Elasticsearch版本...

    Elasticsearch Demo 读取word内容写入到Es上并展示在WebFrom页面上

    Elasticsearch提供丰富的查询语法,如term查询、match查询、bool查询等。在这个Demo中,我们可能使用了简单的match查询来查找关键字,同时利用Elasticsearch的`highlight`功能,对查询结果中的匹配关键字进行高亮...

    PHP中 对es中的数据分页 查询

    总的来说,PHP与Elasticsearch的集成能帮助开发者高效地处理和查询大数据。通过封装查询类,不仅可以简化代码,还能提高代码的复用性和可维护性。在实际项目中,可以根据具体需求进行调整和扩展,构建更强大的ES查询...

    elasticsearch学习笔记

    Elasticsearch(以下简称ES)是当前最流行的搜索引擎之一,本文旨在通过对ES的基本操作和查询语法的介绍,帮助读者快速入门和精通ES。 批量操作 ES提供了多种批量操作方式,包括通过GET _mget、GET 索引/_mget、GET ...

    es从行json文件中查询相关内容

    标题 "es从行json文件中查询相关内容" 涉及的是使用Elasticsearch(简称ES)从JSON格式的行文件中检索数据。Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,常用于实时的全文检索、分析和存储。在...

    java elasticsearch 存储查询

    在Elasticsearch中,查询条件可以通过QueryBuilders来创建,如term查询、match查询、range查询等。这些条件类可能帮助构建复杂的查询结构。 `exception`目录可能包含了一些自定义异常类,用于捕获和处理与Elastic...

    elasticsearch-7.4.0-win64.rar

    Elasticsearch是一个开源的全文搜索引擎,它以分布式、RESTful服务的方式提供快速、高可用、可扩展的数据搜索和分析能力。这个"elasticsearch-7.4.0-win64.rar"压缩包包含了Elasticsearch 7.4.0版本的Windows 64位...

    Elasticsearch_python使用文档

    Elasticsearch 提供了丰富的查询语法,包括单条件查询、多条件查询和复合查询。 #### 4.1 单条件查询 ```python # 查询 name 为 'John Doe' 的文档 query = {'query': {'term': {'name': 'John Doe'}}} res = es....

    elasticsearch JAVA使用手册

    查询DSL包含多种类型的查询,例如Match All查询、全文查询、范围查询、term级查询、复合查询、连接查询、地理查询、特化查询和Span查询等。此外,还有专门的脚本查询,通过Script API和内置脚本语言来实现复杂的查询...

    elasticsearch-2.4.4.zip

    在使用 Elasticsearch 进行数据索引和查询时,你需要了解如何创建索引、映射文档类型、发送 CRUD 操作以及执行复杂的查询和聚合。Elasticsearch 提供了丰富的查询语法,包括 term 查询、match 查询、range 查询、...

Global site tag (gtag.js) - Google Analytics