查询必须完全匹配2个字段,不要分析

时间:2016-10-13 15:25:57

标签: elasticsearch

我尝试了几种不同的方式来执行简单的get请求,过滤两个不同的属性,示例

"query": {
    "filtered": {
        "filter": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "email": "erik.landvall@example.com"
                        }
                    },
                    {
                        "term": {
                            "password": "bb3810356e9b60cf6..."
                        }
                    }
                ]
            }
        },
        "query": {
            "match_all": []
        }
    }
}

问题在于我得不到任何回报。据我了解,这是因为ElasticSearch会分析电子邮件字段,导致查询失败。因此,如果我使用术语erik.landvall而不是完整的电子邮件地址,它将与文档匹配 - 这确认了正在发生的事情。

我可以在创建索引时将属性定义为type:stringindex:not_analyzed。但是如果我想能够在不同的上下文中搜索电子邮件属性呢?因此,在我看来,应该指明我想要在查询中过滤属性的实际值。但是,我无法找到这样的查询的样子。

查询时是否可以强制Elasticsearch使用“not_analyze”?如果是这样,那怎么样?

2 个答案:

答案 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" 
      }
    }
  }

}“