文章内容自动完成建议

5
我们的目标
我们希望给予用户在输入时获得搜索建议的能力,但是ElasticSearch建议器没有提供任何与我们从文章中获取文本片段建议的用例相匹配的内容。对于标题具有很大变化的索引来说,Ngramming和搜索文档标题是可以的,但对于少量文章来说,标题代表的信息量不足,并且许多搜索短语返回零结果。我们也不能让用户使用相关提示线索标记所有文档。
我们的文档通常包括标题、描述(正文)以及各种其他属性,如组、类别和部门。
我们目前的解决方案:单独索引中的Shingles
每次索引文档时,我们调用elasticsearch的_analyze端点为文档的描述+标题生成shingles(2-5)。然后将每个结果(shingles会产生大量结果)存储为一个名为“Suggestion”的字段,存储在原始文档的副本中的新索引中。这是因为一些用户可能希望缩小属于某个类别或任何其他任意过滤的文档建议的范围,我们提供了该选项。
原始文件(主索引):
{
    "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字的文章,我们很容易得到数百甚至数千个瓦片,每个瓦片都会复制整个主文档。
为了进行搜索,我们在建议文档中进行前缀搜索,并使用术语聚合来获取出现最频繁的单词组合,我们的用户实际上有点喜欢这种解决方案,只要他们没有更好的选择。

另一种更简单但速度过慢的解决方案
我们尝试了使用shingles分析器仅分析copy_to字段(自动完成),然后使用包含正则表达式过滤器的terms聚合来删除不以搜索短语开头的术语,但是由于每个字段的不相关术语数量太大,这样做会非常缓慢且占用内存。

搜索:“fabulo”

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

基于之前的搜索建议
我们正在研究如何基于之前的搜索短语提供建议,但是如果新用户没有太多的用户生成的搜索,他们还需要一些基于内容的自动完成建议。

问题:
有没有更快、更简单、更好的方法呢? ElasticSearch的suggesters似乎都需要您提前知道建议或具有描述性标题。对于大量文本内容的建议来说,这似乎很适用于产品建议,但是我们还需要考虑过滤问题。


1
你看过edge-nGrams吗? 你可以在edge-nGrams字段上使用搜索查询,而不是使用建议API。虽然不像建议那样快,但你仍能获得相当不错的响应时间,我个人认为。 - Archit Saxena
太好了。 :) 那奖品是什么啊,哈哈? - Archit Saxena
我稍微尝试了一下,但似乎我需要对从高亮器返回的字符串进行相当多的后处理。在我能否确定它是否是真正的解决方案之前,我需要进行更多的实验。不过,这仍然是一个非常好的选择。 - Silas Hansen
另一个建议:您可以在标准分析字段上进行突出显示,而搜索可以在ngram分析字段上进行。 - Archit Saxena
@SilasHansen,你找到显示自动建议的解决方案了吗? - Sagar Patel
显示剩余5条评论
1个回答

0

我们正在使用组合的shingles和聚合到专用索引中:

  1. 选择所有应作为自动完成短语来源的字段,并添加一个带有shingles过滤器的子字段
"type": "shingle",
            "max_shingle_size": 3,
            "min_shigle_size": 1
          },
  1. 定期使用术语聚合查询所有这些字段的索引,从所有聚合中收集关键字,对于每个关键字(或在2、3个单词shingles的情况下是短语),汇总来自所有聚合的文档计数
  2. 将结果关键字放入单独的索引中,并提取文档计数作为权重
  3. Elastic现在支持上下文字段以缩小建议索引范围,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#context-suggester
  4. 将自动完成搜索指向单独的索引

谢谢您的建议。您能详细说明一下“Elastic现在支持分类字段来缩小建议索引范围”的意思吗?我不确定您具体指的是哪个功能。 - Silas Hansen
啊,它被称为“上下文”,而不是类别。您可以向每个建议记录添加多个这样的上下文以添加额外的过滤。请注意,在弹性7中上下文的数量是有限制的。请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html#context-suggester - dsmog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接