Solr 建议最常见的结果而不返回整个短语

Solr suggest most common result without returning entire phrase

我们正在寻求实现用于搜索 Solr 核心的建议下拉列表。 我们已经有了没有实施建议的基本搜索,所以核心已经设置好了。我正在尝试全面了解我的问题的详细信息,但不会过于复杂。

如果他们正在搜索单个词,我们希望建议最常见的单个匹配词。

如果他们搜索多个词,我们希望推荐最常见的组合词组。如果组合词组不存在,我们希望从该词组中的一个词中获得最常见的结果。

我试图为建议实施一个解决方案,而不必创建另一个核心,我必须在其中解析单词、短语和计数。

我研究了拼写检查器并提出了组件建议。

我遇到的问题是 suggest 只 return 整个字段。我们希望它只有 return 他们开始输入的字数。

我在使用拼写检查器时遇到的问题是,如果单词拼写正确(有道理,它是一个拼写检查器),它不会 return 得到正确的结果。而且,如果我们拼写检查多个单词,它们会在结果中分开。如果他们搜索多个词并且有一个匹配项,我们希望两个词 returned 如果它们的顺序相同,我们希望用户使用正确的拼写。

我们正在搜索的核心文档场景:

{title: 5ft transparent tape},
{title: 5ft transparent dressing},
{title: onsite training},
{title: tape dispenser},
{title: countertop tape dispenser},
{title: 3ft tape measure},
{title: 5ft tape measure},
{title: 10ft tape measure},
{title: tape media}

3个字符后才开始提示。只想要 1 个结果。

search: "tra"
returns: transparent

^^ 思路:return最常见的单个匹配词,"transparent"出现次数多于"training"。

search: "tape me"
returns: "tape measure"

^^ 思路:return最常见的两个匹配词,"tape measure"出现次数多于"tape media"。

search: "cassette tape"
returns: "tape"

^^ 想法:"cassette tape" 不存在,"cassette" 也不存在,所以它 return 是最常见的词,"tape"。

Nice to have, but not required:
search: "tape " (with space)
returns: "tape measure"

^^ idea:它知道space表示他们即将输入另一个词和return最常见的两个词以第一个词开头,"tape measure"出现更多比 "tape media" 和 "tape dispenser".

关于如何使用现有核心实现此目的的任何想法?我已经想到了一种通过对数据进行切片和切块并创建建议组件来使用新核心来完成此操作的方法,但我想使用我们现有的核心。是否可以使用自定义令牌过滤器?自定义令牌过滤器目前在我的脑海中,但如果可能的话我会试一试。

感谢您的帮助!

查看 AnalyzingInfix 建议器 https://lucidworks.com/2015/03/04/solr-suggester/

我必须找到正确的过滤器。 ShingleFilterFactory - 此过滤器从标记流构造带状标记,它们是标记 n-gram。它将令牌运行组合成一个令牌。

https://lucene.apache.org/solr/guide/7_0/filter-descriptions.html#shingle-filter

<fieldType name="spellcheck_phrase" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.ShingleFilterFactory" maxShingleSize="4" outputUnigrams="false"/>
  </analyzer>
</fieldType>

上面分析器的例子:

在:"To be, or not to be."

要过滤的分词器:"To"(1)、"be"(2)、"or"(3)、"not"(4)、"to" (5), "be"(6)

输出:"To be"(1),"To be or"(1),"To be or not"(1),"be or"(2),"be or not"(2 ), "be or not to"(2), "or not"(3), "or not to"(3), "or not to be"(3), "not to"(4), "not to be"(4), "to be"(5)