首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在elasticsearch上查找具有空字符串值的文档

在elasticsearch上查找具有空字符串值的文档
EN

Stack Overflow用户
提问于 2014-08-29 13:03:57
回答 12查看 73.9K关注 0票数 39

我一直在尝试用elasticsearch过滤那些正文中包含空字符串的文档。到目前为止,我没有任何运气。

在我继续之前,我应该提到,我已经尝试了分布在Interwebz和StackOverflow上的许多“解决方案”。

因此,下面是我尝试运行的查询,后面是对应的查询:

代码语言:javascript
复制
{
    "query": {
        "filtered":{
            "filter": {
                "bool": {
                    "must_not": [
                        {
                            "missing":{
                                "field":"_textContent"
                            }
                        }
                    ]
                }
            }
        }
    }
}

我还尝试了以下几种方法:

代码语言:javascript
复制
 {
    "query": {
        "filtered":{
            "filter": {
                "bool": {
                    "must_not": [
                        {
                            "missing":{
                                "field":"_textContent",
                                "existence":true,
                                "null_value":true
                            }
                        }
                    ]
                }
            }
        }
    }
}

以及以下内容:

代码语言:javascript
复制
   {
    "query": {
        "filtered":{
            "filter": {
                    "missing": {"field": "_textContent"}
            }
        }
    }
}

上述方法都不起作用。当我确定有包含空字符串字段的记录时,我得到一个空结果集。

如果有人能为我提供任何帮助,我将不胜感激。

谢谢!

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2014-08-29 14:39:07

如果您使用的是默认分析器(standard),那么如果它是空字符串,就没有什么可分析的了。因此,您需要逐字索引该字段(而不是分析)。下面是一个示例:

添加一个映射,该映射将索引未标记化的字段,如果还需要索引的字段的标记化副本,则可以使用Multi Field类型。

代码语言:javascript
复制
PUT http://localhost:9200/test/_mapping/demo
{
  "demo": {
    "properties": {
      "_content": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

接下来,为几个文档建立索引。

代码语言:javascript
复制
/POST http://localhost:9200/test/demo/1/
{
  "_content": ""
}

/POST http://localhost:9200/test/demo/2
{
  "_content": "some content"
}

执行搜索:

代码语言:javascript
复制
POST http://localhost:9200/test/demo/_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "_content": ""
        }
      }
    }
  }
}

返回包含空字符串的文档。

代码语言:javascript
复制
{
    took: 2,
    timed_out: false,
    _shards: {
        total: 5,
        successful: 5,
        failed: 0
    },
    hits: {
        total: 1,
        max_score: 0.30685282,
        hits: [
            {
                _index: test,
                _type: demo,
                _id: 1,
                _score: 0.30685282,
                _source: {
                    _content: ""
                }
            }
        ]
    }
}
票数 23
EN

Stack Overflow用户

发布于 2019-04-01 22:37:09

在这里找到解决方案https://github.com/elastic/elasticsearch/issues/7515它不需要重新索引就能工作。

代码语言:javascript
复制
PUT t/t/1
{
  "textContent": ""
}

PUT t/t/2
{
  "textContent": "foo"
}

GET t/t/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "textContent"
          }
        }
      ],
      "must_not": [
        {
          "wildcard": {
            "textContent": "*"
          }
        }
      ]
    }
  }
}
票数 12
EN

Stack Overflow用户

发布于 2015-03-12 20:45:54

即使使用默认分析器,您也可以执行这种搜索:使用script filter,它速度较慢,但可以处理空字符串:

代码语言:javascript
复制
curl -XPOST 'http://localhost:9200/test/demo/_search' -d '
{
 "query": {
   "filtered": {
     "filter": {
       "script": {
         "script": "_source._content.length() == 0"
       }
     }
   }
 }
}'

它将返回没有特殊映射的_content形式的空字符串文档

正如@js_gandalf所指出的,对于ES>5.0,这是不推荐使用的。相反,您应该像在https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html中那样使用: query->bool->filter->script

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25561981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档