Term Query {#query-dsl-term-query}
term
查询查找和倒排索引中的词 精确 匹配的文档。例如:
POST _search
{
"query": {
"term" : { "user" : "Kimchy" }
}
}
- 在
user
字段的倒排索引中查找和词Kimchy
精确匹配的文档。
可以指定 boost
参数以使这个 term
查询比另一个 term
查询获得更高的相关性分数,例如:
GET _search
{
"query": {
"bool": {
"should": [
{
"term": {
"status": {
"value": "urgent",
"boost": 2.0
}
}
},
{
"term": {
"status": "normal"
}
}
]
}
}
}
-
urgent
查询子句权重2.0
,意味着它比normal
查询子句重要两倍。 -
normal
子句默认权重1.0
。
term
查询也可以和 range data types 搭配。
字符串字段可以是 text
(全文本,如电子邮件的正文),或者 keyword
(精确值,如电子邮件地址或者邮政编码)。精确的值(如数字,日期和关键字)会被添加到字段的倒排索引中,以使其可搜索。
但是, text
字段会被 分析
。这意味着他们的值首先通过 分析器 生成一个词列表, 然后这些词被添加到倒排索引中。
分析文本的方式有很多种:默认的 标准
分析器会丢弃大多数标点符号,将文本分解为单个单词,并将其小写。例如,standard
分析器会把字符串 `Quick Brown Fox!'' 分解成 [`quick
,brown
, fox
]。
这个分析过程使得在一大块全文本中搜索单个单词成为可能。
term
查询在字段的倒排索引中查找 精确 匹配的词 — 它对于字段的分析器一无所知。这使得在关键字字段或者数字字段或者日期字段中查找值非常有用。查询全文本字段时,使用 match
查询,它理解字段是怎么被分析的。
要演示,请尝试下面的示例。首先,创建索引,指定字段的映射,并索引文档:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"full_text": {
"type": "text"
},
"exact_value": {
"type": "keyword"
}
}
}
}
}
PUT my_index/_doc/1
{
"full_text": "Quick Foxes!",
"exact_value": "Quick Foxes!"
}
-
full_text
字段是text
类型,会被分析。 -
exact_value
字段是keyword
类型,不会被分析。 -
full_text
倒排索引包含词: [quick
,foxes
]。 -
exact_value
倒排索引包含词: [Quick Foxes!
]。
现在,对比 term
查询和 match
查询的结果:
GET my_index/_search
{
"query": {
"term": {
"exact_value": "Quick Foxes!"
}
}
}
GET my_index/_search
{
"query": {
"term": {
"full_text": "Quick Foxes!"
}
}
}
GET my_index/_search
{
"query": {
"term": {
"full_text": "foxes"
}
}
}
GET my_index/_search
{
"query": {
"match": {
"full_text": "Quick Foxes!"
}
}
}
-
这个查询匹配到文档是因为
exact_value
字段的倒排索引中包含词
Quick Foxes!
。 -
这个查询不能匹配到文档,因为
full_text
字段的倒排索引中只包含词
quick
和foxes
。不包含词Quick Foxes!
。 -
在
full_text
字段上,对词foxes
做term
查询,能匹配到文档。 -
在
full_text
字段上做match
查询,首先会分析查询字符串,然后查找包含quick
或者foxes
或者这两个词都包含的文档。