Elasticsearch或筛选查询不返回结果

时间:2015-08-25 11:52:44

标签: elasticsearch

我有以下数据集:

{
    "_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 docs,第二种语法来自另一个具有相同版本的项目):

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。

2 个答案:

答案 0 :(得分:0)

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

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

or-filters正在运行。所以一般的答案是:如果你遇到这样的问题,请仔细检查你的映射,而不要做太多的工作。

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

答案 1 :(得分:0)

索引“某个名称”时,会将其分为以下标记 -

"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的更多信息。