我们正在寻求实现一个建议下拉列表,以搜索Solr核心。 我们已经有了基本搜索,但没有实施建议,因此已设置了核心。我正在努力详尽地回答我的问题,而不会过于复杂。
如果他们正在搜索单个单词,我们希望建议最常见的单个匹配单词。
如果他们要搜索多个单词,我们希望建议最常用的组合短语。如果不存在组合词组,则我们希望从该词组中的一个词中获得最常见的结果。
我试图为建议实施解决方案,而不必创建另一个核心,我必须在其中解析单词,词组和计数。
我研究了拼写检查器并提出了一些建议。
我建议的问题是它只返回整个字段。我们希望它只返回与他们开始键入时一样多的单词。
我对拼写检查器遇到的问题是,如果单词拼写正确,它不会返回正确的结果(很有意义,这是一个拼写检查器)。而且,如果我们对多个单词进行拼写检查,它们将在结果中分开。如果他们搜索多个单词并且匹配,那么我们希望两个单词的顺序相同时都返回它们,并且我们希望用户使用正确的拼写。
我们正在搜索的核心文档场景:
{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
^^想法:返回最匹配的单个单词,“透明”比“训练”更多。
search: "tape me"
returns: "tape measure"
^^想法:返回最匹配的两个单词,“ tape measure”比“ tape media”出现更多。
search: "cassette tape"
returns: "tape"
^^想法:“盒式磁带”不存在,“盒式磁带”也不存在,因此它返回最常用的单词“ tape”。
Nice to have, but not required:
search: "tape " (with space)
returns: "tape measure"
^^想法:它知道空格意味着他们将要输入另一个单词并返回以第一个单词开头的最常见的两个单词,“ tape measure”比“ tape media”和“ tapepenser”更多。 / p>
关于如何通过使用现有内核实现此目标的任何想法?我已经想过一种通过使用新的核心来实现此目的的方法,即对数据进行切片和切块,并创建建议组件,但是我想使用我们拥有的核心。使用自定义令牌过滤器是否可以?目前,自定义令牌过滤器已经遍布我的脑海,但如果可以的话,我会给它一个机会。
感谢您的帮助!
答案 0 :(得分:1)
我必须找到正确的过滤器。 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>
上面的分析仪示例:
在:“成为或不成为。”
要过滤的标记生成器:“至”(1),“成为”(2),“或”(3),“非”(4),“至”(5),“成为”(6)>
输出:“要成为”(1),“要成为或”(1),“要成为或不”(1),“要或”(2),“要或不是”(2),“是或不属于“(2),“或不属于”(3),“或不属于”(3),“或不属于”(3),“不属于”(4),“不属于”( 4),“成为”(5)
答案 1 :(得分:0)
看一看AnalysisInfix建议程序 https://lucidworks.com/2015/03/04/solr-suggester/