我们的目标我们希望使用户能够在开始输入内容时获得搜索建议,但是ElasticSearch建议者没有提供任何适合我们从文章中获取文本摘要建议的用例。对标题进行索引和索引的Ngramming和搜索对于具有很多标题且变化很大的索引是很好的,但是对于少数文章,标题只是不能代表足够的信息,并且很多搜索短语将返回零结果。我们也不能让用户使用相关建议线索标记所有文档。
我们的文档通常由标题和描述(正文)以及其他各种属性(如组,类别和部门)组成。
[我们当前的解决方案:带一个单独的索引 每次我们为文档建立索引时,我们都会调用elasticsearch _ analyze端点以生成用于文档描述和标题的带状文字(2-5)。然后将每个结果(带状疱疹产生大量结果)存储为一个名为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字的文章,我们可以很容易地获得成百上千的带状疱疹,每个带状疱疹都复制了整个主要文档。
To search,我们在建议文档中进行前缀搜索并进行术语汇总,以获取最频繁出现的单词组合,并且我们的用户只要没有更好的条件,实际上就喜欢这种解决方案。
另一种更简单但又太慢的解决方案我们试图使用带状疱疹分析器分析copy_to字段(自动完成),然后使用regex include-filter进行术语汇总,以删除并非以搜索词组开头的术语,但这是只是太慢而导致内存不足,因为每个字段的无关术语(对于特定查询)的数量太大。
搜索:“ fabulo”
{
"size": 0,
"aggs": {
"autocomplete": {
"terms": {
"field": "autocomplete",
"include": {
"pattern": "fabulo(.*)"
}
}
}
},
"query": {
"prefix": {
"autocomplete": {
"value": "fabulo"
}
}
}
}
关于先前搜索的基础建议我们正在基于先前的搜索短语创建建议,但是如果新用户很少有用户生成的搜索,则他们也需要根据内容提供一些自动完成建议。
问题:有什么方法可以更快,更简单,更好地做到这一点?ElasticSearch suggesters似乎都需要您事先了解建议或具有描述性的标题。似乎非常适合产品建议,但不适用于大文本内容建议。另外,我们要考虑过滤问题。