ElasticSearch-query-term_精确查询
2025-01-22 08:19:30    489 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)

term是代表完全匹配,文档中必须包含整个搜索的词汇


1. term 完全匹配

以下示例,查询 books索引、book类型下,name为’中国古代音乐史’的文档。

1
2
3
4
5
6
7
8
GET books/book/_search
{
"query": {
"term": {
"name": "中国古代音乐史"
}
}
}

这个例子执行完,什么都没查出来,百思不得其解,网上查了下,意思是:elasticsearch 里默认的IK分词器是会将每一个中文都进行了分词的切割,直接想查一整个词,或者一整句话是无返回结果的

这里借用keyword,进行加持

1
2
3
4
5
6
7
8
GET books/book/_search
{
"query": {
"term": {
"name.keyword": "中国古代音乐史"
}
}
}

查询非中文不会出现上述情况

1
2
3
4
5
6
7
8
GET books/book/_search
{
"query": {
"term": {
"price": "31"
}
}
}

2. 查询时,加.keyword与不加.keyword的区别是什么?

  1. ES5.0及以后的版本取消了string类型,将原先的string类型拆分为text和keyword两种类型。它们的区别在于text会对字段进行分词处理而keyword则不会。

  2. ES的term query做的是精确匹配而不是分词查询,因此对text类型的字段做term查询将是查不到结果的(除非字段本身经过分词器处理后不变,未被转换或分词),
    此时,必须使用.keyword来对字段以keyword类型进行精确匹配


3. terms(查找多个精确值)

查询 books索引、book类型下,价格为31 或 30 的文档

1
2
3
4
5
6
7
8
GET books/book/_search
{
"query": {
"terms": {
"price": ["31","30"]
}
}
}

4. Reference