ElasticSearch搜索term和terms的区别

今天同事使用ES查询印地语的文章。发现查询报错,查询语句和错误信息如下:

查询语句:{    "query":{        "bool":{            "must":[                {                    "range":{                        "update_time":{                            "gt":"1488556800000"                        }                    }                },                {                    "terms":{                        "lang":1                    }                },                {                    "terms":{                        "domain":[                            "dailymasala.co",                            "goldenmob.com"                        ]                    }                },                {                    "prefix":{                        "user_id":"errVideo_setInterval_"                    }                }            ]        }    },    "from":0,    "size":10}

错误信息:{    "error":{        "root_cause":[            {                "type":"parsing_exception",                "reason":"[terms] query does not support [lang]",                "line":1,                "col":93            }        ],        "type":"parsing_exception",        "reason":"[terms] query does not support [lang]",        "line":1,        "col":93    },    "status":400}

其实这么看上去好像并没有什么问题,但是就是查询不成功。

问题出在查询lang这个字段上。

在查询的字段只有一个值的时候,应该使用term而不是terms,在查询字段包含多个的时候才使用terms(类似于sql中的in、or),使用terms语法,JSON中必须包含数组。

正确的写法如下:

第一种(单个值,term):
{
    "query":{
        "bool":{
            "must":[
                {
                    "range":{
                        "update_time":{
                            "gt":"1488556800000"
                        }
                    }
                },
                {
                    "term":{
                        "lang":1
                    }
                },
                {
                    "terms":{
                        "domain":[
                            "dailymasala.co",
                            "goldenmob.com"
                        ]
                    }
                },
                {
                    "prefix":{
                        "user_id":"errVideo_setInterval_"
                    }
                }
            ]
        }
    },
    "from":0,
    "size":10
}

第二种(数组形式,terms):
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "update_time": {
              "gt": "1488556800000"
            }
          }
        },
        {
          "terms": {
            "lang": [1]
          }
        },
        {
          "terms": {
            "domain": [
              "dailymasala.co",
              "goldenmob.com"
            ]
          }
        },
        {
          "prefix": {
            "user_id": "errVideo_setInterval_"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10
}
时间: 2024-10-08 09:30:09

ElasticSearch搜索term和terms的区别的相关文章

网站基于ElasticSearch搜索的优化笔记 PHP

基本情况就是,媒体.试题.分类,媒体可能有多个试题,一个试题可能有多个分类,分类为三级分类加上一个综合属性.通过试题名称.分类等搜索查询媒体. 现在的问题为,搜索结果不精确,部分搜索无结果,ES的数据结构不满足搜索需求.解决方案就是,重构ES数据结构,采用父子关系的方式,建立media和question两个type. 全程使用https://github.com/mobz/elasticsearch-head,这个进行ES的管理和查看,很方便. 从ES的说明可以看出,ES是面向文档,其实所有的数

Es学习第七课, term、terms、match等基本查询语法

term.terms查询 term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword.numeric.date等明确值的 term:查询某个字段里含有某个关键词的文档 GET /customer/doc/_search/ { "query": { "term": { "title": "blog" } } } terms:查询某个字段里含有多个关键词的文档 GET /custome

通过HTTP RESTful API 操作elasticsearch搜索数据

通过HTTP RESTful API 操作elasticsearch搜索数据

elasticsearch搜索提示

elasticsearch搜索提示(补全)接口需要新增suggest字段并设type为:completion,结合到scrapy,修改es_types.py文件: from datetime import datetime from elasticsearch_dsl import DocType, Date, Nested, Boolean, analyzer, InnerObjectWrapper, Completion, Keyword, Text, Integer from elasti

ElasticSearch(十一) Term level Queries API

term query terms query range query exists query prefix query wildcard query regexp query fuzzy query type query ids query 原文地址:https://www.cnblogs.com/xiaocandou/p/8119548.html

ElasticSearch搜索介绍四

ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, "timed_out": false, "_shards": { "total": 16, "successful": 16, "failed": 0 }, "hits": { "tota

Elasticsearch搜索结果返回不一致问题

一.背景 这周在使用Elasticsearch搜索的时候遇到一个,对于同一个搜索请求,会出现top50返回结果和排序不一致的问题.那么为什么会出现这样的问题? 后来通过百度和google,发现这是因为Elastcisearch的分布式搜索特性导致.Elasticsearch在搜索时,会循环的选择主分片和其副本中的一个来计算和返回搜索结果,而由于主分片和副本中相关统计信息的不同,从而导致了同一个搜索串的评分的不一致,进而导致排序不一样.而造成这种主分片和副本统计信息不一致的具体原因,是因为文档删除

ElasticSearch 关于term搜索不到指定数据的问题

ElasticSearch 在搜索中文是.首先通过KI分词/KI分词是吧所有的中文分解成单个中文, 在每次通过term搜索中文时,不会将体育两次分词,但ElasticSearch里面保存的都是单个中文,所以导致未搜索到数据. 在通过搜索“体”字时即可搜到. 原文地址:https://www.cnblogs.com/imaye/p/9903897.html

(21)ElasticSearch java项目中match、multimath、term、terms以及范围、前缀、通配符、模糊、类型、ids等查询示例

1.查询index1中content字段包含工厂的文档 @Test public void testMatch() throws IOException, InterruptedException, ExecutionException { //指定集群 Settings settings = Settings.builder().put("cluster.name","my-application").build(); //创建客户端 TransportClien