使用Lucene处理同义词(短语)的最佳方法是什么? 特别是,当我需要执行以下查询时:a OR b OR c NOT NOT
如何在编制索引时为每个文档添加一个名为“同义词”的新字段? 该字段的值将包含所有同义词的列表。只有当该文档具有任何同义词时,才会将其添加到文档中。
然后我会执行一个“OR”搜索查询,该查询会在此字段中查找搜索关键字以及其他字段。
这种方法适用于任何类型的查询吗?
FYI, 我的应用程序中的同义词完全是自定义的,而不是来自英语词典...即。 “全球金融领袖”也可能意味着“顶级投资银行”或“财富500强金融公司”等。
请建议。
感谢。
答案 0 :(得分:12)
Lucene项目有一个名为“wordnet”的贡献。根据{{3}}:
此软件包使用WordNet定义的同义词构建存储它们的Lucene索引,后者又可用于查询扩展。您通常运行Syns2Index一次以构建查询索引/“数据库”,然后调用SynExpand.expand(...)来扩展查询。
它包含了它的作用样本:
如果您传入查询“大狗”,则打印出来:
查询:
big adult^0.9 bad^0.9 bighearted^0.9 boastful^0.9 boastfully^0.9 bounteous^0.9 bountiful^0.9 braggy^0.9 crowing^0.9 freehanded^0.9 giving^0.9 grown^0.9 grownup^0.9 handsome^0.9 large^0.9 liberal^0.9 magnanimous^0.9 momentous^0.9 openhanded^0.9 prominent^0.9 swelled^0.9 vainglorious^0.9 vauntingly^0.9 dog andiron^0.9 blackguard^0.9 bounder^0.9 cad^0.9 chase^0.9 click^0.9 detent^0.9 dogtooth^0.9 firedog^0.9 frank^0.9 frankfurter^0.9 frump^0.9 heel^0.9 hotdog^0.9 hound^0.9 pawl^0.9 tag^0.9 tail^0.9 track^0.9 trail^0.9 weenie^0.9 wiener^0.9 wienerwurst^0.9
你看到原始单词(“大”和“狗”)没有附加权重。但是,同义词的权重(0.9)可以自行配置。
它与Lucene的标准发行版捆绑在“contrib”目录中。
答案 1 :(得分:1)
使用QueryParser.parse()解析输入查询字符串后,可以获取Query对象。
在大多数情况下,顶级查询是布尔查询,子查询作为其子查询。您可以递归迭代查询对象。当您点击TermQuery或PhraseQuery对象时,您可以获得(子)查询,并将该查询对象替换为由其synoyms组成的布尔查询对象(如果有)。
基本上,您正在转换原始查询
a OR b AND c
到
(a OR synA) OR (b OR synB1 OR synB2) AND c
在查询对象上操作可确保您只需使用新查询替换查询的叶节点,而不会使用任意复杂的查询层次结构。
答案 2 :(得分:0)
我更喜欢使用输入的整个短语进行搜索,并且重量比下一系列搜索更重的任何重量。然后,我喜欢遍历短语中的每个单词并使用那些搜索结果获得较低的分数。然后,我汇总了多次返回的所有项目的分数,并相应地对结果进行排序。这可能不是100%这样做的最佳方式......但它在过去对我有用。