我已经成功地为Lucene设计了一款捷克狐猴。我正在用Solr测试它,它在索引时运行得很好。但是,当用于查询时,它工作得不太好,因为查询解析器没有向狐猴提供任何上下文(前面或后面的单词)。
例如,短语pila vodu在索引时的分析与查询时的分析不同。它使用了歧义词pila,它可以表示pila (例如链锯)或pít (动词"to drink“的过去式)。
pila vodu ->
pít vodapila voda。。因此,在文档片段中找不到单词pila,也不会突出显示该单词。
这种行为记录在solr wiki (引用如下),我可以通过调试我的代码来确认它(只有孤立的字符串"pila“和"vodu”被传递给狐猴)。
..。Lucene QueryParser在将任何文本提供给分析器之前在空白上进行标记,因此如果一个人搜索单词
sea biscit,分析器将分别被赋予单词"sea“和"biscit”,.
所以我的问题是:
是否有可能以某种方式更改、配置或修改查询解析器,从而使狐猴能够看到整个查询字符串,或者至少看到单个单词的某些上下文?我想有一个解决方案,也为不同的solr查询解析器,如dismax或edismax。
我知道,像"pila vodu" (引号)这样的短语查询没有这样的问题,但是如果没有确切的短语(例如,带有"pila víno“甚至"pila dobrou vodu”的文档),我就会丢失文档。
编辑--试着解释/回答以下问题(谢谢@femtoRgon):
如果这两个术语不是一个短语,所以不一定会结合在一起,那么为什么它们要在上下文中相互分析呢?
当然,最好是只分析合并的条款。例如,在索引时,引理器检测输入文本中的句子,并且只对单个句子中的单词进行分析。但是,如何在查询时实现类似的事情呢?实现我自己的查询解析器是唯一的选择吗?我非常喜欢pf2和pf3解析器的选项,如果是我自己的解析器,我需要再次实现它们吗?
背后的想法实际上更深一点,因为狐猴正在进行词义消歧,甚至对于具有相同词汇基础的单词也是如此。例如,bow一词在英语中大约有7个不同的词义(参见维基百科),而狐猴就是区分这类意义的。因此,我想利用这一潜力,使搜索更加精确--只返回包含查询所需具体意义上的单词bow的文档。因此,我的问题可以扩展到:如何为查询项获得正确的<lemma;sense>-pair?如果这个词是在其共同的上下文中呈现的,那么它通常能够指定正确的意义,但是当没有上下文的时候,它就没有机会了。
发布于 2018-01-04 14:22:35
最后,我实现了自己的查询解析器。
感谢作为指南和参考实现的edismax源代码,这并不困难。我可以很容易地将解析器的结果与edismax的结果进行比较。
解决方案:
首先,我一起分析整个查询字符串。这给了我“记号”的列表。
与停止词有一点冲突,因为分析器忽略了停止词的标记,因此获得停止词的标记并不容易,但是您可以从PositionIncrementAttribute中检测到它们。
在“令牌”中,我以与edismax相同的方式构造查询(例如,创建在DisjunctionMaxQuery实例中组合的所有2-令牌和/或3-令牌短语查询)。
https://stackoverflow.com/questions/39849662
复制相似问题