我们的目标
我们希望使我们的用户能够在开始键入时获得搜索建议,但是ElasticSearch建议者没有提供任何适合我们从文章中获取文本摘要建议的用例。对具有大量变化很大的标题的索引进行Ngramming和搜索文档标题是很好的,但是对于少数文章,标题只是不能代表足够的信息,并且很多搜索短语将返回零结果。我们也不能让用户使用相关建议线索标记所有文档。

我们的文档通常包括标题和说明(正文),以及其他各种属性,例如组,类别和部门。

我们当前的解决方案:在单独的索引中带状

每次我们为文档建立索引时,我们都将调用elasticsearch _analyze端点以生成用于文档描述和标题的瓦片(2-5)。然后,每个结果(带状疱疹会产生大量结果)都存储为一个名为“建议”的字段,并存储在新索引的原始文档的副本中。这是因为某些用户可能希望缩小对属于特定类别的文档的建议,或者我们可以选择提供的任何其他任意过滤器。

原始文档(主索引):

{
    "Title": "A fabulous document",
    "Description": "A document with fabulous content"
    "Category": "A"
}

建议文件(建议索引)
(Suggestion 1)
{
    "Title": "A fabulous document",
    "Description": "A document with fabulous content",
    "Category": "A"
    "Suggestion": "A"

}
(Suggestion 2)
{
    "Title": "A fabulous document",
    "Description": "A document with fabulous content",
    "Category": "A"
    "Suggestion": "A document"

}
...
(Suggestion N)
{
    "Title": "A fabulous document",
    "Description": "A document with fabulous content",
    "Category": "A"
    "Suggestion": "a document with"

}

但是,正如您所看到的,对于一篇1000字的文章,我们可以轻松获得成百上千的带状疱疹,每个带状疱疹都复制了整个主文档。

要搜索,我们在建议文档中进行前缀搜索并进行术语汇总,以获取出现频率最高的单词组合,并且我们的用户只要没有更好的条件,实际上就喜欢此解决方案。

另一个更简单但太慢的解决方案
我们试图使用带状疱疹分析器来分析copy_to字段(自动完成),然后使用正则表达式include-filter进行术语聚合以删除并非以搜索词开头的术语,但这太慢了和内存不足,因为每个字段的无关术语(针对特定查询)的数量太多了。

搜索:“fabulo”
{
  "size": 0,
  "aggs": {
    "autocomplete": {
      "terms": {
        "field": "autocomplete",
        "include": {
          "pattern": "fabulo(.*)"
        }
      }
    }
  },
  "query": {
    "prefix": {
      "autocomplete": {
        "value": "fabulo"
      }
    }
  }
}

基于先前搜索的建议
我们正在根据先前的搜索词组提供建议,但是如果新用户只有很少的用户生成搜索内容,则他们还需要根据内容提供一些自动完成建议。

问题:
有什么方法可以更快,更简单,更好地做到这一点?
ElasticSearch suggesters似乎都要求您事先了解建议或具有描述性的标题。似乎对产品建议非常有用,但对较大的文本内容建议却不太好。另外,我们要考虑过滤问题。

最佳答案

我们正在使用带状疱疹和聚合的组合成专用索引:

  • 选择应该提供自动完成短语的所有字段,并添加带有带状疱疹过滤器的子字段

  • "type": "shingle",
                "max_shingle_size": 3,
                "min_shigle_size": 1
              },
    
  • 定期在所有这些字段上使用术语聚合查询索引,从所有聚合中收集关键字,对所有聚合中每个关键字(或词组为2个或3个单词的情况下的短语)的文档计数求和
  • 将结果关键字放在单独的索引中,且提取的文档计数为权重
  • Elastic现在支持上下文字段以缩小建议索引的范围,请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#context-suggester
  • 将自动完成搜索定向到单独的索引
  • 10-04 22:41
    查看更多