使用Lucene的同义词

使用Lucene的同义词,lucene,lucene.net,Lucene,Lucene.net,使用Lucene处理同义词(短语)的最佳方法是什么? 特别是,当我需要执行诸如:a、b或c而不是d这样的查询时 在索引时为每个文档添加一个名为“同义词”的新字段如何? 此字段的值将包含所有同义词的列表。只有当文档具有任何同义词时,才会将其添加到文档中 然后,我将执行一个“或”搜索查询,该查询将在该字段以及其他字段中查找搜索关键字 这种方法是否适用于任何类型的查询 仅供参考, 我的应用程序中的同义词完全是自定义的,而不是来自英语词典。“全球金融领袖”也可以指“顶级投资银行”或“财富500强金融公司

使用Lucene处理同义词(短语)的最佳方法是什么? 特别是,当我需要执行诸如:a、b或c而不是d这样的查询时

在索引时为每个文档添加一个名为“同义词”的新字段如何? 此字段的值将包含所有同义词的列表。只有当文档具有任何同义词时,才会将其添加到文档中

然后,我将执行一个“或”搜索查询,该查询将在该字段以及其他字段中查找搜索关键字

这种方法是否适用于任何类型的查询

仅供参考, 我的应用程序中的同义词完全是自定义的,而不是来自英语词典。“全球金融领袖”也可以指“顶级投资银行”或“财富500强金融公司”等

请建议


谢谢。

我更喜欢使用输入的整个短语进行搜索,并对返回的任何内容进行加权,而不是下一系列搜索。然后,我喜欢迭代短语中的每个单词,并用它们进行搜索,结果得分较低。然后,我对返回的所有项目的分数进行汇总,并对结果进行相应排序。这可能不是100%做到这一点的最佳方式……但它在过去对我来说非常有效。

有一个名为“wordnet”的Lucene项目的贡献。根据:

这个包使用WordNet定义的同义词来构建一个Lucene索引来存储它们,而Lucene索引又可以用于查询扩展。您通常运行一次Syns2Index来构建查询索引/“数据库”,然后调用SynExpand.expand(…)来展开查询

它包括一个其功能的示例:

如果您传入查询“big dog”,则它会打印出:

查询:
大大人^0.9坏^0.9大心肠^0.9自夸^0.9慷慨^0.9慷慨^0.9狂妄自大^0.9狂妄自大^0.9放肆^0.9给予^0.9成熟^0.9成熟^0.9英俊^0.9高大^0.9自由^0.9宽宏大量^0.9重大^0.9慷慨^0.9突出^0.9自负^0.9狂妄自大^0.9
狗和猎犬^0.9黑卫士^0.9黑帮^0.9黑帮^0.9猎犬^0.9追逐^0.9点击^0.9卡位^0.9犬齿^0.9火狗^0.9法兰克福^0.9法兰克福^0.9弗鲁姆^0.9脚跟^0.9热狗^0.9猎犬^0.9爪子^0.9标记^0.9尾巴^0.9跟踪^0.9小径^0.9香肠^0.9香肠^0.9香肠^0.9香肠^0.9香肠^0.9

您可以看到原始单词(“大”和“狗”)没有附加权重。但是,同义词有一个权重(0.9),您可以自行配置


它与Lucene的标准发行版捆绑在一起,位于“contrib”目录中。

您可以在使用QueryParser.parse()解析输入查询字符串后获得查询对象

在大多数情况下,顶级查询是布尔查询,子查询是其子查询。您可以递归地迭代查询对象。点击TermQuery或PhraseQuery对象时,可以获取(子)查询,并将该查询对象替换为包含其同义词(如果有)的布尔查询对象

实际上,您正在转换原始查询

a OR b AND c 


对查询对象进行操作时,请确保您只需用新查询替换查询的叶节点,并且不要随意修改复杂的查询层次结构。

感谢您的输入Adam…您能再次参考我的问题吗?我现在已经编辑了它。WordNet模块会像您一样构建Lucene索引。它构建的索引最终用于扩展查询。如果您只是尝试从WordNet的字典中构建这个索引,我相信您可以很容易地知道它用于索引的字段名,并添加您自己的自定义条目。
(a OR synA) OR (b OR synB1 OR synB2) AND c