我一直在尝试用elasticsearch过滤那些正文中包含空字符串的文档。到目前为止,我没有任何运气。
在我继续之前,我应该提到,我已经尝试了分布在Interwebz和StackOverflow上的许多“解决方案”。
因此,下面是我尝试运行的查询,后面是对应的查询:
{
"query": {
"filtered":{
"filter": {
"bool": {
"must_not": [
{
"missing":{
"field":"_textContent"
}
}
]
}
}
}
}
}
我还尝试了以下几种方法:
{
"query": {
"filtered":{
"filter": {
"bool": {
"must_not": [
{
"missing":{
"field":"_textContent",
"existence":true,
"null_value":true
}
}
]
}
}
}
}
}
以及以下内容:
{
"query": {
"filtered":{
"filter": {
"missing": {"field": "_textContent"}
}
}
}
}
上述方法都不起作用。当我确定有包含空字符串字段的记录时,我得到一个空结果集。
如果有人能为我提供任何帮助,我将不胜感激。
谢谢!
发布于 2014-08-29 14:39:07
如果您使用的是默认分析器(standard
),那么如果它是空字符串,就没有什么可分析的了。因此,您需要逐字索引该字段(而不是分析)。下面是一个示例:
添加一个映射,该映射将索引未标记化的字段,如果还需要索引的字段的标记化副本,则可以使用Multi Field类型。
PUT http://localhost:9200/test/_mapping/demo
{
"demo": {
"properties": {
"_content": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
接下来,为几个文档建立索引。
/POST http://localhost:9200/test/demo/1/
{
"_content": ""
}
/POST http://localhost:9200/test/demo/2
{
"_content": "some content"
}
执行搜索:
POST http://localhost:9200/test/demo/_search
{
"query": {
"filtered": {
"filter": {
"term": {
"_content": ""
}
}
}
}
}
返回包含空字符串的文档。
{
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: ""
}
}
]
}
}
发布于 2019-04-01 22:37:09
在这里找到解决方案https://github.com/elastic/elasticsearch/issues/7515它不需要重新索引就能工作。
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": "*"
}
}
]
}
}
}
发布于 2015-03-12 20:45:54
即使使用默认分析器,您也可以执行这种搜索:使用script filter,它速度较慢,但可以处理空字符串:
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
https://stackoverflow.com/questions/25561981
复制相似问题