过滤的Elasticsearch查询未返回任何结果

时间:2016-03-05 05:05:00

标签: elasticsearch

我在执行针对Elasticsearch v2.2.0的以下请求时遇到问题。如果我删除filter属性(当然还有内容),我会恢复我的实体(只有一个存在)。使用filter子句,我得到0结果,但没有错误。如果我删除email过滤器和/或name过滤器,则相同。我对此请求做错了吗?

请求

GET http://localhost:9200/my-app/my-entity/_search?pretty=1

{
    "query": {
        "filtered" : {
            "query": {
                "match_all": {}
            },
            "filter": {
                "and": [
                    {
                        "term": {
                            "email": "my.email@email.com"
                        }
                    },
                    {
                        "term": {
                            "name": "Test1"
                        }
                    }
                ]
            }
        }
    }
}

现有实体

{
    "email": "my.email@email.com",
    "name": "Test1"
}

映射

"properties": {
    "name": {
        "type": "string"
    },
    "email": {
        "type": "string"
    },
    "term": {
        "type": "long"
    }
}

1 个答案:

答案 0 :(得分:0)

由于email字段为analyzedcustom analyzer没有,Standard Analyzer将被应用于它,它将分成令牌。 在这里阅读Standard Tokenizer

您可以使用以下命令查看my.email@email.com如何进行标记化。

curl -XGET "http://localhost:9200/_analyze?tokenizer=standard" -d "my.email@email.com".

这将生成以下输出。

{
 "tokens": [
  {
     "token": "my.email",      ===> Notice this
     "start_offset": 0,
     "end_offset": 8,
     "type": "<ALPHANUM>",
     "position": 1
  },
  {
     "token": "email.com",     ===> Notice this
     "start_offset": 9,
     "end_offset": 17,
     "type": "<ALPHANUM>",
     "position": 2
    }
   ]
}

如果您想要完整或精确搜索,则需要进行not_analyzed。研究如何创建not_analyzed字段here

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

希望很清楚