首页 > 解决方案 > EdgeNgram autocomplete_filter 对前缀搜索有意义吗?

问题描述

我有大约 100 万条记录的弹性搜索索引。
我想对弹性搜索索引、名称和 ID 中的 2 个字段进行多前缀搜索(总共大约 10 个)。
创建 EdgeNgram 自动完成过滤器是否有意义?
或者我错过了 EdgeNGram 的要点。
这是我用于创建索引的代码:

client.indices.create({
    index: 'testing',
    // type: 'text',
    body: {
     settings: {
      analysis: {
        filter: {
          autocomplete_filter: {
            type: 'edge_ngram',
            min_gram: 3,
            max_gram: 20
          }
        },
        analyzer: {
          autocomplete: {
            type: 'custom',
            tokenizer: 'standard',
            filter: [
              'lowercase',
              'autocomplete_filter'
            ]
          }
        }
      }
    }
   }
},function(err,resp,status) {
  if(err) {
    console.log(err);
  }
  else {
    console.log("create",resp);
  }
});

搜索代码

client.search({  
  index: 'testing',
  type: 'article',
  body: {
    query: {
        multi_match : {
          query:    "87041",
          fields: [ "name", "id" ],
          type: "phrase_prefix"
        }
      }
  }
},function (error, response,status) {
    if (error){
      console.log("search error: "+error)
    }
    else {
      console.log("--- Response ---");
      console.log(response);
      console.log("--- Hits ---");
      response.hits.hits.forEach(function(hit){
        console.log(hit);
      })
    }
});

搜索返回正确的结果,所以我的问题是在这种情况下创建 edgengram 过滤器和分析器有意义吗?
或者这个前缀功能是开箱即用的?
非常感谢您的信息

标签: node.jselasticsearchsearch

解决方案


这取决于您的用例。让我解释。

  1. 您可以使用ngram此功能。假设你的数据是london bridge,那么如果你的 min gram 是 1 并且 max gram 是 20,它将被标记为l, lo, lon, etc.. 这里的好处是即使你搜索bridgeor any tokens which is part of the generated ngrams,它也会被匹配。

  2. 有一个out of box feature completion suggester。它使用 FST 模型来存储它们。甚至文档都说it is faster to search but costlier to build. 但想想就是这样prefix suggester。意思是搜索默认bridge不会带来london bridge。但是有一些方法可以使这项工作。实现的解决方法是,拥有令牌数组。这里london bridgebridge是令牌。

  3. 还有一种叫做context suggester。如果您知道要在nameor上进行搜索id,则最好完成提示。当完成建议器处理所有索引时,上下文建议器根据上下文处理特定索引。

正如您所说,您可以完成前缀搜索。你提到有 10 个这样的字段。如果您知道要在最前面建议的领域,那么您可以选择上下文建议器。

关于边缘 ngram 和完成的一个很好的答案

中间词的完成建议- 我使用了这个解决方案,它就像魅力一样。

您可以参考文档以获取建议器中可用的其他默认选项。


推荐阅读