【问题标题】:query must match 2 fields exactly, don't analyze查询必须完全匹配2个字段,不要分析
【发布时间】: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:stringindex: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


【解决方案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 文件并重新启动节点。

如果这种查询相当有规律,那么按照其他人在 cmets 中的建议重新索引数据会更好。

【讨论】:

    【解决方案2】:

    不可能打开/关闭分析,通过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" 
          }
        }
      }
    

    }'

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2018-10-17
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    相关资源
    最近更新 更多