ES中match和term差别对比,text和keyword区别、bool查询?
参考回答
1. Match 和 Term 查询的区别
- Match 查询:用于全文搜索,适用于分析过的字段。它会对字段内容进行分词、标准化等处理,适合模糊查询,能够处理包含空格、标点符号等的复杂文本查询。Match 查询会使用字段的分析器(analyzer)来处理查询词。
- Term 查询:用于精确匹配,适用于没有分析的字段。它不会对查询词进行分词或标准化处理,因此 Term 查询只能对精确的值进行匹配,通常用于对关键字、数字或日期等类型的字段进行查询。
例子:
match查询:如果文档字段description为"quick brown fox", 使用match查询"quick brown"时,会返回该文档,因为match会进行分词和标准化。term查询:如果查询"quick",只有完全匹配该词的文档才会返回。
2. Text 和 Keyword 字段的区别
- Text 类型:适用于需要分词处理的字段,通常用于包含大量文本的字段,如文章内容、评论等。
text字段的数据会经过分析器(analyzer)处理,进行分词、去除停用词等操作。查询时,text字段支持模糊匹配。 -
Keyword 类型:适用于需要精确匹配的字段,如标签、ID、状态等。
keyword字段不会进行分词处理,数据将按原样存储,查询时可以直接进行精确匹配。keyword字段常用于排序、聚合和精确查询。例子:
text字段(如description):适用于存储长文本,查询时支持模糊搜索。keyword字段(如product_id或status):适用于存储标识符和分类信息,查询时进行精确匹配。
3. Bool 查询
-
Bool 查询:是 Elasticsearch 中一种复杂的查询方式,它允许组合多个查询条件(如
must、filter、should、must_not)来构建灵活的查询。它支持布尔逻辑,能够满足不同的查询需求。 -
关键组成部分:
- must:查询条件必须满足,类似于 AND。
- should:查询条件如果满足,将提高文档的相关度,但不是必须的,类似于 OR。
- must_not:查询条件不能满足,类似于 NOT。
- filter:与
must类似,但它不计算相关度,适用于过滤条件,性能更高。
例子:
- 查询条件:查找
category为 “electronics” 且price小于 1000 的产品,或者category为 “clothing” 且price大于 50 的产品:“`json
{
"query": {
"bool": {
"must": [
{ "match": { "category": "electronics" }},
{ "range": { "price": { "lt": 1000 }}}
],
"should": [
{ "match": { "category": "clothing" }},
{ "range": { "price": { "gt": 50 }}}
],
"minimum_should_match": 1
}
}
}
“`
详细讲解与拓展
1. Match 和 Term 查询的差别
-
Match 查询:
- 使用场景:适用于需要全文搜索的场景,如搜索文章内容、评论等文本字段。由于它会先对查询字符串进行分词,分词后的查询词会和文档中经过分析的字段进行匹配。
- 特点:支持模糊匹配,可以处理停用词和标点符号。对于大多数文本字段,
match查询是推荐的选择。 - 例子:假设
description字段为"The quick brown fox", 执行match查询"quick fox",它会返回该文档,因为match查询会对"quick fox"进行分词后匹配到quick和fox。
- Term 查询:
- 使用场景:适用于精确匹配,如 ID、状态字段等。
term查询不会对查询词进行分词处理,而是按照原始的值进行匹配。 - 特点:要求查询词与字段内容完全匹配,适合对数值、日期、标签等字段进行精确匹配。
- 例子:如果
category字段值是"electronics",term查询"electronics"会返回该文档。如果查询"Electronics"(带有大写字母),term查询将不匹配,因为它是精确的。
- 使用场景:适用于精确匹配,如 ID、状态字段等。
2. Text 和 Keyword 字段的区别
- Text 字段:
- 用于存储较长的文本数据。此类字段通常会被分词处理,使得 Elasticsearch 可以高效地对文档中的单词进行查询。
- 常用场景:描述性内容(如文章内容、评论、产品描述)等。
- 查询方式:支持全文搜索,能够对字段进行分词、模糊匹配、分析等操作。
- Keyword 字段:
- 用于存储需要精确匹配的短文本数据,通常不进行分词处理。
keyword类型的数据是原样存储的,可以进行精确匹配、聚合、排序等操作。 - 常用场景:ID、标签、分类信息、状态等。
- 查询方式:精确查询,支持聚合、排序等操作,但不支持分词匹配。
- 用于存储需要精确匹配的短文本数据,通常不进行分词处理。
3. Bool 查询
- 组合查询:通过布尔逻辑,将多个查询条件组合成一个复合查询。
bool查询的强大之处在于它可以让用户根据不同的需求对查询条件进行精确控制。通过合理使用must、should和filter,可以灵活实现复杂查询。 - 性能优化:通过
filter语句进行条件过滤时,ElasticSearch 会跳过相关度计算,提高查询效率。 -
常见使用场景:
- 多条件查询:例如,查找符合多个条件的文档,或者查找至少满足某些条件的文档。
- 组合查询:例如,查找符合某些条件的文档,同时不包含其他条件的文档。
总结
- Match 和 Term 查询:
match用于全文搜索,支持分词和模糊匹配;term用于精确匹配,不支持分词。 - Text 和 Keyword 字段:
text字段适用于需要分词的长文本,keyword字段适用于精确匹配的短文本。 - Bool 查询:通过组合多个查询条件,
bool查询使得用户可以灵活地进行复杂查询,并支持性能优化。