从文章内容自动填充建议

时间:2017-03-29 07:35:18

标签: search elasticsearch autocomplete

我们的目标
我们希望为用户提供在开始输入时获取搜索建议的能力,但ElasticSearch建议者不提供任何似乎适合我们从文章中获取文本片段建议的用法。 Ngramming和搜索文档的标题适用于具有很多标题的索引具有很大的变化,但对于少数文章,标题只是不代表足够的信息和大量的搜索短语返回零结果。我们也不能让用户用相关的建议线索标记所有文件。

我们的文件通常包括标题和描述(正文)以及各种其他属性,如群组,类别和部门。

我们当前的解决方案:单独索引中的带状疱疹
每次我们索引文档时,我们都会调用elasticsearch _analyze 端点来生成文档描述+标题的带状疱疹(2-5)。然后将每个结果(带状疱疹产生大量结果)存储为新索引中原始文档副本中名为 Suggestion 的字段。这是因为某些用户可能希望缩小对属于某个类别的文档或我们提供选项的任意其他过滤的建议。

原始文件(主要索引):

const toPercent=(val)=>{
  return 'toPercent';
}
const toPx=(val)=>{
  return 'toPx';
}
const getVal = (type, a, b, val) => {
    return type? (a && b? val :( a ?  toPercent(val) : undefined)) : toPx(val); 
}
console.log(getVal('type',0,0,100));
console.log(getVal('type',1,0,100));
console.log(getVal('type',1,2,100));

建议文件(建议索引)

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

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

要搜索,我们会在建议文档和术语聚合中进行前缀搜索,以获得最常出现的单词组合,而我们的用户实际上就像这种解决方案一样,只要他们不在有更好的东西。

另一种更简单,但速度太慢的解决方案
我们尝试使用带状疱疹分析器分析 copy_to 字段(自动完成),然后使用regex include-filter执行术语聚合,以删除不以搜索短语开头的术语,但是这太慢了,内存很难,因为每个字段的不相关术语(针对特定查询)的数量太多了。

搜索:“fabulo”

(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"

}

基于之前搜索的建议
我们正在根据以前的搜索词组提出建议,但如果新用户用户生成的搜索很少,则需要根据内容提供一些自动填充建议。

问题:
有没有办法更快,更简单,更好地做到这一点? ElasticSearch suggesters似乎都要求您提前了解建议或拥有描述性标题。似乎非常适合产品建议,但不适用于大型文本内容建议。另外,我们还要考虑过滤问题。

1 个答案:

答案 0 :(得分:0)

我们正在将带状疱疹和聚集的组合用于专用索引:

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