【发布时间】:2012-12-17 00:33:20
【问题描述】:
为了允许用户使用 Lucene 3.5 跨多个字段进行搜索,我目前创建了 QueryParser 并将每个要搜索的字段添加到 DisjunctionMaxQuery。这在使用 OR 作为默认运算符时效果很好,但我现在想将默认运算符更改为 AND 以获得更准确(更少)的结果。
问题是,queryParser.setDefaultOperator(QueryParser.AND_OPERATOR) 遗漏了许多文档,因为所有术语都必须在至少 1 个字段中。
例如,考虑文档的以下数据:标题字段 =“编程语言”,正文字段 =“Java、C++、PHP”。如果用户要搜索 Java Programming,则此特定文档不会包含在结果中,因为标题和正文字段包含查询中的所有术语,尽管它们组合在一起。我希望为上述查询返回此文档,而不是为查询 HTML Programming。
我考虑过一个包罗万象的领域,但我有一些问题。首先,用户经常在他们的查询中包含每个字段的术语(作者:bill),这对于一个包罗万象的字段是不可能的。此外,我使用 FastVectorHighlighter 突出显示某些字段,这需要对它们进行索引和存储。因此,通过添加一个包罗万象的字段,我将不得不对大多数相同的数据进行两次索引,这既费时又费空间。
有什么想法吗?
【问题讨论】:
-
关于索引一个包罗万象的字段,您是否观察到引起关注的时间/空间命中?我的经验是在特定的存储字段中索引相同的数据,然后添加到通用的仅索引字段对性能或索引大小的影响非常小。
-
另外,我想知道最终查询的结构是什么样的。特别是如何设置 dis-max 查询。很容易扼杀你获得有意义分数的能力。
-
@femtoRgon disjunctionMaxQuery 结构是这样的:'((title:java title:programming) | (body:java body:programming))~0.2' 你提出了一个很好的观点,即添加一个包罗万象的字段就时间/空间而言,可能影响不大。我确实考虑过但决定反对它,因为我还想保留按字段搜索的能力,例如作者:比尔。用户不仅使用此功能,而且我在幕后使用它。谢谢。