我尝试了几种不同的方式来执行简单的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
”?如果是这样,那怎么样?
答案 0 :(得分:1)
您可以使用scripting来实现此目的。您必须直接访问使用_source存储的JSON。请尝试以下查询
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"inline" : "_source.email==param1 && _source.password==param2",
"params" : {
"param1" : "erik.landvall@example.com",
"param2" : "bb3810356e9b60cf6"
}
}
}
}
}
}
}
您需要enable dynamic scripting。将script.inline: on
添加到yml文件并重新启动节点。
如果这种查询相当规律,那么像其他人在评论中建议的那样重新索引数据会好得多。
答案 1 :(得分:1)
无法打开/关闭是否已分析,可以通过using fields将您的字段“转换”为您需要的分析。
curl -XPUT 'localhost:9200/my_index?pretty' -d'
{
"mappings": {
"my_type": {
"properties": {
"city": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}'
curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -d'
{
"city": "New York"
}'
curl -XPUT 'localhost:9200/my_index/my_type/2?pretty' -d'
{
"city": "York"
}'
curl -XGET 'localhost:9200/my_index/_search?pretty' -d'
{
"query": {
"match": {
"city": "york"
}
},
"sort": {
"city.raw": "asc"
},
"aggs": {
"Cities": {
"terms": {
"field": "city.raw"
}
}
}
}“