Term-level queries.Term query

100 阅读3分钟

Term query

source:www.elastic.co/guide/en/el…

path:Elasticsearch - Query DSL - Term-level queries - Tem query

搜索指定field包含指定term的document

你可以使用term query基于一个精确的值来查找document,例如price,product ID或者username。

Warning:应避免在textfield上使用term query。默认地,Elasticsearch改变了text field的值,因为存在分析的过程。这让对textfield的精确匹配变得困难。要搜索text field,请使用match query。

Example request

GET /_search
{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "boost": 1.0
      }
    }
  }
}

Top-level parameters for term

field

(Required,object)要搜索的Field

Parameters for field

value

(Required,string)你要在指定Field中搜索的term。返回的document的对应field的值必须与搜索的term完全一致,包括空格和大小写

boost

(Optional,float)浮点数,用于减少或增加一个query的score。默认为1.0。你可以使用boost参数来调整包含两个或多个query的搜索的分数。boost的值是相对1.0来说的。在0到1.0的boost会减少score,而大于1.0的boost会增加score。

case_insensitive[7.10.0]

(Optional,Boolean)默认为false,当设为true时,允许field索引的值与要搜索的term进行大小写不敏感的匹配。默认为false这意味着大小写是否敏感依赖于底层field的mapping。

Note

Avoid using the term query for text field

默认地,Elasticsearch会在分析过程中改变text field的值。例如,默认的标准analyzer会像下面一样改变text field。

  • 移除大部分标点符号
  • 讲内容分割为单独的word,称之为tokens
  • 对token进行小写化

为了更好地搜索text field,match query会在进行搜索之前对你要搜索的term也进行分析。这意味着match query是对text field分析后的token进行搜索,而不是准确的token。

term query并不会对要搜索的term进行分析。term query只会对你所提供的精确的term进行搜素。这意味着当term query对text field进行搜索时,结果可能不理想甚至是错的。

下面的例子展示了搜索结果的差异

  1. 创建一个带有名为full_texttext field的索引
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_text": { "type": "text" }
    }
  }
}
  1. 索引进一个document,其full_text field值为 Quick Brown Foxes!
PUT my-index-000001/_doc/1
{
  "full_text":   "Quick Brown Foxes!"
}

由于full_text field是text field,Elasticsearch会将 Quick Brown Foxes! 分析为 [quick, brown, fox]

  1. 使用term query在full_text field上搜索 Quick Brown Foxes!
GET my-index-000001/_search?pretty
{
  "query": {
    "term": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

因为full_text field不再包含Quick Brown Foxes!这个精确的term,所以term query不会返回结果。

  1. 使用match query来搜索Quick Brown Foxes!
GET my-index-000001/_search?pretty
{
  "query": {
    "match": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

term query不同,match query 对所提供的 Quick Brown Foxes!在搜索前进行分析。match query会返回在full_text field上包含quick, brown, 或fox token的所有document。

下面是match query的响应

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "full_text" : "Quick Brown Foxes!"
        }
      }
    ]
  }
}