lucene 多个分词查找
Lucene的“ 建议”模块提供了许多有趣的自动建议实现,以便在用户将每个字符输入搜索框时为他们提供实时搜索建议。
例如, WFSTCompletionLookup
将所有建议及其权重编译到一个紧凑的有限状态传感器中 ,从而可以对基本建议进行快速前缀查找。
AnalyzingSuggester
使用Analyzer
对建议和用户查询进行规范化, Analyzer
对此进行了改进,以使Analyzer
确定的空白,大小写,停用词,同义词等琐碎的差异不会阻止建议的匹配。
最后, AnalyzingInfixSuggester
允许缀相匹配,以便每个建议(不只是前缀)内部的话可以触发匹配更进一步。 您可以在我最近创建的Lucene / Solr Jira搜索应用程序 (例如尝试“ python”)中看到这一动作, 该动作可以吃我们自己的狗粮 。 这也是迄今为止唯一支持突出显示的建议程序实现( 事实证明 ,这对其他建议程序具有挑战性 )。
但是,所有这些建议者的共同限制是,他们只能从有限的先前构建的建议集中提出建议。 如果您的建议是过去的用户查询,并且您有很多建议(例如,您是Google),那么这可能不是问题。 另外,如果您的建议天生就是封闭的,例如Netflix搜索将建议的电影和电视节目名称,或电子商务网站上的所有产品名称,则建议使用一组封闭的建议。
N-Gram语言模型
对于其他所有人,其中大部分传入查询都落入了前所未有的长尾巴中 ,Lucene的最新建议者FreeTextSuggester
可以为您提供帮助! 它使用此Google博客文章中描述的方法。
与其精确地匹配先前的建议,不如从所有建议中构建一个简单的统计n-gram语言模型 ,并查看最后的标记(加上用户键入的任何最终标记的前缀,如果存在),以预测最可能的下一个标记令牌。
例如,到目前为止,用户的查询可能是:“ flashforge 3d p”,并且由于flashforge是3D打印机的罕见品牌,因此从未向建议者添加此特定建议前缀。 但是,“ 3d打印机”在其他情况下(不同品牌)是一个经常出现的短语。 在这种情况下,即使从未明确添加“ flashforge 3d打印机”作为建议, FreeTextSuggester
仍将为下一个标记看到“ 3d”和“ p”前缀并预测打印机。
创建建议者时,您可以指定模型的顺序(N):N的值越大,需要更多的数据来进行正确训练,但可以做出更准确的预测。 还构建了所有低阶模型,因此,如果指定N = 3,则将得到三字母组,双字母组和单字母组,它们全部编译为单个加权FST,以最大程度地共享文本令牌。 当然,更大的N将创建更大的FST。 在实践中,N = 3是您应该采取的最高方法,除非您有大量的建议要训练,并且RAM拥有大量的结果以保持FST。
为了处理稀疏数据,在给定上下文(前N-1个单词)的出现频率不足以做出准确的预测的情况下,建议者使用愚蠢的退避语言模型 (是的,这确实是它的名字,是的,它的表现很好!)。
我希望使用此新的FreeTextSuggester
的最佳方法将是回退:您将首先使用现有的完全匹配建议者之一,但是当这些建议者找不到给定查询的任何建议时,因为它“不寻常”且已交叉从长尾巴上FreeTextSuggester
,然后又回到FreeTextSuggester
。
谷歌似乎用这样的模式方法的建议,以及:如果键入“flashforge 3D P”你应该看到这样的事情,其中每个建议涵盖整个查询到目前为止(事实上,谷歌已经听到了flashforge品牌的3D打印机!):
但是,如果您继续输入并输入“ flashforge 3d打印机电源u”,则建议会发生变化:Google不会建议一个完整的查询,而是匹配我键入的所有内容,而是建议最后一两个字:
与往常一样,此功能是非常新的功能,可能包含令人兴奋的错误! 有关详细信息, 请参见Jira问题LUCENE-5214 。 如果您使用这个新的建议者,请在Lucene的用户列表上开始讨论!
翻译自: https://www.javacodegeeks.com/2014/01/finding-long-tail-suggestions-using-lucenes-new-freetextsuggester.html
lucene 多个分词查找