【问题标题】:Elasticsearch OR filtered query does not return resultsElasticsearch OR 过滤查询不返回结果
【发布时间】:2015-09-03 14:05:38
【问题描述】:

我有以下数据集:

{
    "_index": "myIndex",
    "_type": "myType",
    "_id": "220005",
    "_score": 1,
    "_source": {
        "id": "220005",
        "name": "Some Name",
        "type": "myDataType",
        "doc_as_upsert": true
    }
}

像这样进行直接匹配查询:

GET typo3data/destination/_search
{
    "query": {
        "match": {
            "name": "Some Name"
        }
    },
    "size": 500
}

将返回数据就好了:

"hits": {
    "total": 1,
    "max_score": 3.442347,
    "hits": [...

但是做一个 OR 查询(我不确定哪种语法是正确的,第一个语法取自 elasticsearch 文档,第二个是从另一个具有相同版本的项目中提取的有效查询):

GET typo3data/destination/_search
{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "or": {
                    "filters": [
                        {
                            "term": {
                                "name": "Some Name"
                            }
                        }
                    ]
                }
            }
        }
    },
    "size": 500
}

或

{
    "query":
    {
            "match_all": {}
    },
    "filter":
    {
            "or":
            [
                    { "term": { "name": "Some Name"} },
                    { "term": { "name": "Some Other Name"} }
            ]
    },
    "size": 1000
}

不返回任何内容。

名称字段的映射是:

"name": {
  "type": "string",
  "index": "not_analyzed"
}

Elasticsearch 版本是 1.4.4。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    当索引 "some name" 时,它被分成如下标记 -

    "some name" => [ "some" , "name" ]
    

    现在在普通的匹配查询中,在匹配结果之前也会做同样的处理。如果存在“相同”或“名称”,则该文档被限定为结果

     match query ("some name") => search for term "some" or  "name"
    

    术语查询不会分析或标记您的查询。这意味着它会查找不存在的“某个名称”的确切标记或术语。

     term query ("some name") => search for term "some name"
    

    因此您不会看到任何结果。 如果您制作字段 not_analyzed ,事情应该可以正常工作,但要确保案例也匹配, 你可以阅读更多关于同一here的信息。

    【讨论】:

    • 啊...因为 term 正在寻找 exact 短语,而 match 寻找配件零件...所以在这种情况下 match 会更合适,而不是 term。但是它不会让我将匹配作为关键字放入“或”数组中。为什么我不能在“or”中使用“match”而不是“term”?
    • match 是一个查询,而不是一个过滤器。您可以使用普通的布尔查询(应该部分)来获得或功能,或者您需要将匹配查询嵌入到查询过滤器中 - elastic.co/guide/en/elasticsearch/reference/current/…
    • 我会调查的。谢谢你的信息!
    【解决方案2】:

    在扩展我们的映射以包含我们拥有的每个字段之后:

    PUT typo3data/_mapping/destination
    {
        "someType": {
            "properties": {
                "id": {
                    "type": "integer"
                },
                "name": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "parentId": {
                    "type": "integer"
                },
                "type": {
                    "type": "string"
                },
                "generatedUid": {
                    "type": "integer"
                }
            }
        }
    }
    

    或过滤器正在工作。所以一般的答案是:如果你有这样的问题,仔细检查你的映射,而不是对它们做太多的工作而不是太少。

    如果有人解释了为什么会发生这种情况,我很乐意将答案传递给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 2021-01-22
      • 2016-08-14
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多