【发布时间】:2016-10-14 11:47:14
【问题描述】:
我尝试了几种不同的方法来做一个简单的 get 请求,过滤两个不同的属性,示例:
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"email": "erik.landvall@example.com"
}
},
{
"term": {
"password": "bb3810356e9b60cf6..."
}
}
]
}
},
"query": {
"match_all": []
}
}
}
问题是我没有得到任何回报。据我了解,这是因为 ElasticSearch 分析了电子邮件字段,导致查询失败。因此,如果我使用术语 erik.landvall 而不是完整的电子邮件地址,它将与文档匹配 - 这证实了正在发生的事情。
我可以在创建索引时将属性定义为type:string 和index:not_analyzed。但是,如果我希望能够在不同的上下文中搜索电子邮件属性怎么办?因此,在我看来,应该有一种方法来指定我想过滤查询中属性的实际值。但是我找不到这样的查询会是什么样子。
查询时是否可以强制 Elasticsearch 使用“not_analyze”?如果是,那怎么办?
【问题讨论】:
-
我没有太多时间来回答您的问题,但请看这里:stackoverflow.com/questions/40007971/…,我想您也会对此感兴趣:elastic.co/guide/en/elasticsearch/reference/current/… - 您可以指定多个一个输入 json 字段具有不同映射的字段。如果没有人会更深入地回答您的问题,我会在明天回答。
-
@Adam 这两个建议似乎都解决了在创建索引时在查询之前指定映射的问题。我的问题是是否可以在不更改索引的情况下指定它。
-
我从未使用过它,但可以在查询级别指定分析器,但并非所有查询都允许它。如果您不想分析输入字符串,那么您只需要指定关键字分析器。您可以在此处阅读更多信息:stackoverflow.com/questions/32565662/… 或查看此处(查询中的分析器字段):elastic.co/guide/en/elasticsearch/reference/current/…
-
@Adam 我在这里得到了一些答案,但没有一个适合我的需要。但我还没有放弃。我尝试了
keyword分析器,但它在电子邮件字段上根本不匹配,我认为该字段在持久化时已经被分析,并且在查询时,没有@符号可以比较。用zero_terms_query做了一些测试。到目前为止,它似乎可以满足我的需求,但不确定如果同一字段中有 2 封电子邮件,它将如何处理。keyword分析器似乎是我想要使用的,但有些东西让我搞砸了。
标签: elasticsearch