Elasticsearch 中的查询可以分为两大类:Full Text 查询和 Exact Value 查询。这两种查询方式分别适用于不同的应用场景,下面通过示例来演示它们的使用:
Full Text 查询
Full Text 查询主要用于处理文本字段,允许对文本进行模糊匹配、短语匹配、同义词匹配等复杂的文本分析。Elasticsearch 使用分词器对文本进行分析,然后在索引中查找与查询条件匹配的词汇。常见的 Full Text 查询包括 match
、match_phrase
和 multi_match
等。
示例 1:match
查询
假设有一个名为 articles
的索引,其中有一个 content
字段存储文章正文。我们想搜索包含关键词 “big data” 的文章:
GET articles/_search
{
"query": {
"match": {
"content": "big data"
}
}
}
在这个查询中,Elasticsearch 会对 "big data"
进行分词,可能生成单个词汇 "big"
和 "data"
,然后查找 content
字段中包含这两个词汇的文档。由于是 Full Text 查询,它会考虑词根、同义词、近似匹配等因素,因此可能会匹配到包含 “big data analysis”、“large amounts of data” 等相关表述的文章。
示例 2:match_phrase
查询
如果要精确匹配短语 “big data” 而不是分开的两个词汇,可以使用 match_phrase
查询:
GET articles/_search
{
"query": {
"match_phrase": {
"content": "big data"
}
}
}
此查询会确保 “big” 和 “data” 两个词汇相邻且顺序正确地出现在 content
字段中,即寻找原文中包含完整短语 “big data” 的文章。
示例 3:multi_match
查询
对于跨多个字段进行相同 Full Text 查询的情况,可以使用 multi_match
:
GET articles/_search
{
"query": {
"multi_match": {
"query": "big data",
"fields": ["title", "content"]
}
}
}
这个查询会在 title
和 content
两个字段中同时查找包含 “big data” 的文档,匹配逻辑与 match
类似。
Exact Value 查询
Exact Value 查询主要针对数值、日期、布尔值等非文本字段,或者已设置为 keyword
类型(未分词)的文本字段。这类查询要求查询条件与索引中的值完全一致,不涉及分词、同义词匹配等文本分析过程。常见的 Exact Value 查询包括 term
、terms
、range
、exists
等。
示例 1:term
查询
假设 articles
索引有一个 category
字段,存储文章类别,值为未经分词的字符串。我们要找出类别为 “Technology” 的文章:
GET articles/_search
{
"query": {
"term": {
"category.keyword": "Technology"
}
}
}
这里使用了 .keyword
语法来指定对 category
字段的 keyword
子字段进行查询,确保进行精确匹配。只有 category
值恰好为 “Technology”(大小写敏感)的文档会被返回。
示例 2:range
查询
对于数值或日期字段,可以使用 range
查询进行精确范围匹配。例如,查找发表日期在 2023 年 1 月 1 日至 2023 年 12 月 31 日之间的文章:
GET articles/_search
{
"query": {
"range": {
"publication_date": {
"gte": "2023-01-01",
"lte": "2023-12-31"
}
}
}
}
此查询将精确匹配 publication_date
字段位于指定日期范围内的文章。
总结
Full Text 查询和 Exact Value 查询在 Elasticsearch 中有着明确的应用场景。前者适用于需要进行文本分析、模糊匹配的文本字段查询,后者适用于对数值、日期、特定字符串进行精确匹配的非文本字段或未分词文本字段查询。实际使用时,应根据字段类型和业务需求选择合适的查询类型。