【问题标题】:How can I index a field using two different analyzers in Elastic search如何在弹性搜索中使用两个不同的分析器索引字段
【发布时间】:2017-04-11 12:09:15
【问题描述】:

假设我有一个字段“productTitle”,我想让我的用户使用它来搜索产品。

我还想应用自动完成功能。所以我使用带有以下过滤器的 autocomplete_analyzer:

   "autocomplete_filter": {
        "type":     "edge_ngram",
        "min_gram": 2,
        "max_gram": 10
    }

但是,在用户进行搜索的同时,我不希望应用“edge_ngram”,因为它会产生很多不相关的结果。

例如,当用户想要搜索“mi”并开始输入“m”、“mi”.. 他们应该得到以 m,mi 开头的结果作为自动完成选项。但是,当他们实际进行查询时,他们应该只得到带有单词“mi”的结果。目前他们还看到“迷你”等结果。

因此,是否可以使用两个不同的分析器为“productTitle”编制索引?我可以选择多字段类型吗?

编辑:productTitle 的映射

 "productTitle" : {
                "type" : "string",
                "index_analyzer" : "second",
                "search_analyzer" : "standard",
                "fields" : {
                  "raw" : {
                    "type" : "string",
                    "index" : "not_analyzed"
                  }
                }
              }

, “第二”分析器

"analyzer": {
        "second": {
            "type":      "custom",
            "tokenizer": "standard",
            "filter":   [
                "lowercase",
                "trim",
                "autocomplete_filter"
            ]
        }

所以当我查询时:

  "filtered" : {
    "query" : {
      "match" : {
        "productTitle" : {
          "query" : "mi",
          "type" : "boolean",
          "minimum_should_match" : "2<75%"
        }
      }
    }
  }

我也得到类似"mini" 的结果。但我只需要得到结果,包括 "mi"

谢谢

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    hmm ...据我所知,没有办法为同一字段应用多个分析器...您可以做的是使用“多字段”。 这是一个如何为“子字段”应用不同分析器的示例: https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html#_multi_fields_with_multiple_analyzers

    【讨论】:

    • Thnx barat,这也是我的猜测。
    【解决方案2】:

    防止您在答案中描述的正确方法是在字段映射中同时指定analyzersearch_analyzer,如下所示:

    "productTitle": {
        "type": "string",
        "analyzer": "autocomplete_analyzer",
        "search_analyzer": "standard"
    }
    

    自动完成 analyzer 将在索引时启动并根据您的 edge_ngram 配置标记您的标题,standard 分析器将在搜索时启动而不应用edge_ngram东西。

    在这种情况下,不需要多字段,除非您需要以不同方式标记 productTitle 字段。

    【讨论】:

    • 嗨 Val,实际上这就是我已经在做的事情。我使用 edge_gram 进行索引,然后使用标准分析器进行搜索。但是当我搜索关键字时,我仍然看到 edge_gram 的效果
    • 这不正常。您使用的是哪个版本的 ES?您还可以显示您发送的查询吗?
    • 我正在使用 v1.7。我在我的问题中添加了查询
    • 您得到 mini,因为 mini 已使用标记 miminmini 进行索引,因此您对 mi 的查询与标记 mi 匹配,因此为什么你会得到mini 文档。这是完全正常的。这正是 edge_ngram 令牌过滤器的工作。
    • 我理解 Val,这就是为什么 barat 建议我使用多字段来使用两个分析器来索引数据。一个用于自动完成,另一个用于搜索。在这种情况下,当用户键入“m”、“mi”时,他们将获得“mini”作为自动完成选项,但是当他们进行查询时,他们只会得到“mi”不包括“mini”的结果。这就是我
    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2016-09-04
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多