【问题标题】:partial matching from middle in completion suggestion elasticsearch完成建议elasticsearch中的部分匹配
【发布时间】:2016-11-05 19:44:49
【问题描述】:

我有一个名为 search_suggest 的字段,其中包含以下内容

search_suggest: {
   type: "completion",
   analyzer: "simple",
   payloads: true,
   preserve_separators: false,
   preserve_position_increments: false,
  max_input_length: 50
}

它的值被索引为

{
  input: [
   "apple iphone 6"
  ],
  output: "apple iphone 6",
  weight: 5,
  payload: {
   category: "mobiles"
  }
}

如果我搜索苹果,它会给我结果。但如果我搜索 iphone,它不会给我任何结果。

完成建议有没有办法做到这一点? 我是否必须将输入索引为

  • 苹果iphone 6
  • iphone 6
  • 6

我知道 edge-ngram 建议器。但缺点是它也会建议重复。

请帮忙。

【问题讨论】:

    标签: php search elasticsearch


    【解决方案1】:

    如果有人还在寻找答案,

    完成提示器适用于前缀匹配。因此,在输入中,您可以提供短语的可能后缀。这将允许您进行前缀搜索,即使您从中间开始,也就是子字符串搜索。

    例如:

    {
      "text" : "Courtyard by Marriot Munich City",
      "text_suggest" : {
        "input": [
          "Courtyard by Marriot Munich City",
          "by Marriot Munich City",
          "Marriot Munich City",
          "Munich City",
          "City"
        ],
        "output" : "Courtyard by Marriot Munich City",
        "weight" : 11,
        "payload": { "id" : 314159 }
      }
    }
    

    如您所见,无论您从“慕尼黑市万怡酒店”开始,您都会得到结果。 (“by”除外,因为在大多数情况下它会作为停用词被丢弃)。

    对于一般搜索字符串来说,最多 4-5 步就足够了。此外,如果您使用过滤器处理停用词,则无需担心输入中的停用词。

    样本索引分析器

    {
      "settings" : {
        "analysis" : {
          "filter" : {
            "suggester_stop" : {
              "type" : "stop",
              "stopwords" : "_english_",
              "remove_trailing" : false,
              "ignore_case" : true
            },
            "suggester_stemmer" : {
              "type" : "stemmer",
              "name" : "light_english"
            }
          },
          "analyzer" : {
            "suggester_analyzer" : {
              "type" : "custom",
              "tokenizer" : "standard",
              "char_filter" : ["html_strip"],
              "filter" : [
                "standard",
                "lowercase",
                "suggester_stop",
                "suggester_stemmer"
              ]
            }
          }
        }
      }
    }
    

    这将解决您在其中一个 cmets 中提到的问题:

    那么如果我建议“apple ip”,它不会给出结果。 iPhone 6 怎么样?

    {
      "text_suggest" : {
        "input": [
          "apple iphone 6",
          "iphone 6"
        ],
        "output" : "apple iphone 6",
        "weight" : 11
      }
    }
    

    你会得到“apple ip”、“iphone 6”等的搜索结果。但是你不会得到“apple 6”的结果,这对人们来说并不常见。

    【讨论】:

      【解决方案2】:

      这应该可以解决您的问题

      {
       "input": [ "apple", "iphone", "6" ]
      }
      

      【讨论】:

      • 那么如果我建议 "apple ip" ,它不会给出正确的结果
      • @LijoAbraham 这个“输入”怎么样:[“apple”,“iphone”,“6”,“apple iphone 6”]
      • iphone 6怎么样? :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多