【问题标题】:ElasticSearch - Search for complete phrase onlyElasticSearch - 仅搜索完整的短语
【发布时间】:2015-09-24 17:33:51
【问题描述】:

我正在尝试创建一个搜索,该搜索将准确返回我所要求的内容。

例如,假设我有 2 个文档,其中包含一个名为“Val”的字段

第一个文档的值为“a - Copy”,第二个文档的值为“a - Copy (2)”

我的目标是准确搜索值“a - Copy”并在我返回的结果中只找到第一个文档,而不是两个具有不同相似度排名的文档

当我尝试大多数常见的查询时:

GET test/_search
{
  "query": {
    "match": { 
      "Val": {
          "query": "a - copy",
          "type":  "phrase"
      }
    }
  }
}

或:

GET /test/doc/_search
{
  "query": {
    "query_string": {
      "default_field": "Val",
      "query": "a - copy"
    }
  }
}

我总是得到这两个文件

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    有一个非常好的文档可以在 ES 中找到精确值: https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_exact_values.html

    它向您展示了如何使用 term 过滤器,并且还提到了 analyzed fields 的问题。

    简而言之,您需要像这样运行term 过滤器(我已将您的值放入其中):

    GET /test/doc/_search
    {
        "query" : {
            "filtered" : { 
                "query" : {
                    "match_all" : {} 
                },
                "filter" : {
                    "term" : { 
                        "Val" : "a - copy"
                    }
                }
            }
        }
    }
    

    但是,这不适用于已分析的字段。你不会得到任何结果。

    为了防止这种情况发生,我们需要告诉 Elasticsearch 此字段通过将其设置为 not_analyzed 来包含精确值。

    有多种方法可以实现这一目标。例如custom field mappings

    【讨论】:

      【解决方案2】:

      是的,因为您的字段很可能是 analyzed 并拆分为令牌。

      你需要一个和这个类似的分析器

          "custom_keyword_analyzer": {
            "type": "custom",
            "tokenizer": "keyword",
            "filter": "lowercase"
          }
      

      它使用keyword 标记器和lowercase 过滤器(我注意到您索引了大写字母,但希望使用小写字母进行搜索)。

      然后使用term 过滤器搜索您的文档。

      【讨论】:

        猜你喜欢
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        相关资源
        最近更新 更多