match查询
- 查询方式:
match
查询是一种全文搜索查询,它会根据字段的映射类型进行分词处理。例如,使用match
查询搜索关键词“云计算”:
{
"query": {
"match": {
"article_content": "云计算"
}
}
}
- 结果差异:它会先对查询词“云计算”进行分词,然后在倒排索引中查找分词后的词项,找到包含这些词项的文档,并且会根据词项在文档中的出现频率、位置等因素计算相关性得分,返回相关性较高的文档。比如文章中多次出现“云”“计算”相关的词,该文章相关性得分可能较高就会被返回。
- 分词原理及原因:
match
查询使用的分词器会根据字段的映射配置进行分词(默认使用标准分词器)。标准分词器会将文本按词边界进行切分,如“云计算”可能被切分为“云”“计算”两个词项。在索引时,文档的article_content
字段也同样经过分词处理,存储的是分词后的词项。查询时,将查询词分词后与索引中的词项匹配,由于是分词匹配,所以即使文档中没有完整的“云计算”这个词组,只要有“云”和“计算”相关词,也可能被匹配到,这种方式适合处理全文搜索场景,能返回语义相关的文档。
term查询
- 查询方式:
term
查询是一种精确查询,不会对查询词进行分词处理。例如,查询“云计算”:
{
"query": {
"term": {
"article_content": "云计算"
}
}
}
- 结果差异:它会直接在倒排索引中查找完整的“云计算”这个词项,如果索引中存在这个精确的词项,则返回包含该词项的文档;如果不存在,则不返回任何文档。即使文档中有“云”和“计算”但不是“云计算”这个精确词组,也不会被匹配到。
- 分词原理及原因:
term
查询不进行分词,直接将查询词作为一个整体去索引中查找。在索引时,article_content
字段同样是按配置的分词器进行分词存储词项。但term
查询不考虑分词后的情况,只找精确匹配的词项,这种方式适用于对精确值的查找,如ID、日期等不需要分词的字段查询。如果对文本字段使用term
查询,需要确保索引和查询时的文本格式完全一致,否则可能查不到预期结果。