elasticsearch匹配vs术语查询

Lin*_*lin 67 elasticsearch

我使用匹配查询搜索"request.method":"GET":

    {
      "query": {
        "filtered": {
          "query": {
            "match": {
              "request.method": "GET"
            }
          },
          "filter": {
            "bool": {
              "must": [
...
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,Match查询可以获得结果,如下所示:

在此输入图像描述

但问题是在使用Term查询时,没有结果.

更新查询以将"匹配"更改为"术语",并保持其他部分保持不变:

{
  "query": {
    "filtered": {
      "query": {
        "term": {
          "request.method": "GET"
        }
      },
      "filter": {
        "bool": {
          "must": [
...
Run Code Online (Sandbox Code Playgroud)

我认为Term查询是Match查询的"未分析"版本.如上图所示,至少有一条记录的"request.method"等于"GET".为什么上述Term查询没有结果?谢谢.

在此输入图像描述

Aks*_*hay 88

假设你正在使用的标准分析仪 GET成为get存储在索引时.源文档仍将具有原始"GET".

match查询将相同的标准分析仪适用于搜索词,因此将匹配的内容存储在索引中.该term查询不任何分析仪适用于搜索词,那样只会寻找在倒排索引,准确的用语.

要在示例中使用术语查询,请将大写"GET"更改为小写"get"或更改映射,以便将request.method字段设置为not_analyzed.

  • 或者更改`request.method`字段的映射以键入`keyword` (6认同)

jes*_*rma 7

elasticsearch中term和match的区别

术语是一个精确的查询

匹配是一个模糊查询

术语是完美匹配,即精确查询。搜索词在搜索之前不会被切分,所以我们的搜索词必须是文档切分集之一。假设我们要查找所有名为 Jesus Verma 的文档。

 $curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query":{
    "term":{
"title": "Jesus Verma"
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

匹配查询将首先分类搜索词。分词后,分词结果会一一匹配。因此,相较于term的精确搜索,match是分词匹配搜索,匹配搜索有两个功能相似的变体。一种是match_phrase。一种是 multi_match

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match": {
 "content": "Banglore, India"
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

  • 我不得不对使用“模糊”来描述匹配查询提出异议(还有另一个模糊性参数)。Match 也是精确查询,但查询是通过文本分析器传递的。 (3认同)