1

我有一个 Hibernate 带注释的类TestClass,其中包含一个List<String>我用 Lucene 索引的字段。考虑以下示例:

"Foo Bar"并且"Bar Snafu"是特定记录的列表中的两个条目。现在,如果用户在 TestClass 上搜索"Foo Snafu"然后会找到该记录,我猜是因为令牌 Foo 和令牌 Snafu 都是List<String>该记录中的令牌。

有什么办法可以防止这种情况发生吗?

现实世界的示例是具有原告和被告名单的法院案件。假设有两个人因案件被起诉,Joe Lewis Bob并且Robert Clay Smith。这些用户存储在被告名单中的法庭案件记录中。此被告名单使用 Lucene 编制索引。现在,如果用户搜索前面提到的两个被告中的任何一个,就会找到此案。Lewis Smith但是,如果用户搜索, 或 ,也会找到该案例Joe Clay

更新: 在 Lucene IRC 频道中提到我可以使用多值字段。

更新 2:在 Solr IRC 频道中提到我可以使用positionIncrementGap设置schema.xml来通过 Solr 完成此操作。显然,如果我使用短语查询(带或不带 slop),那么“增量间隙确保同一字段中的不同值不会导致意外匹配”。

4

1 回答 1

0

Lucene 将连续添加到同一文档中的同一字段,添加到它在该字段中已有的内容的末尾。

如果您想将 List 的每个成员视为一个完全独立的实体,您应该在不同的字段中对它们进行索引。您可以将索引附加到您已经使用的字段名称。虽然我没有关于您的需求的完整信息,但当然,做这样的事情可能是更好的解决方案。

如果您只想搜索精确的文本"Foo Snafu",您可以使用PhraseQuery。如果您想确保您的短语查询不会从一个列表项交叉到下一个列表项(即,如果您在索引中有"Bar Foo""Snafu Bar"),您可以在写入索引时在每个成员之间插入某种形式的定界术语。

于 2013-02-25T23:06:32.907 回答