Lucene在Hibernate List字段中搜索

时间:2013-02-25 19:25:11

标签: java hibernate jpa lucene

我有一个Hibernate带注释的类TestClass,它包含一个List<String>字段,我正在使用Lucene编制索引。请考虑以下示例:

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

有没有办法阻止这种情况发生?

现实世界的例子是法院案件,其中包含原告和被告名单。假设有两个人被起诉,Joe Lewis BobRobert Clay Smith。这些用户存储在被告名单中的法院案件记录中。这份被告名单上有Lucene索引。现在,如果用户搜索前面提到的两个被告中的任何一个,就会找到案例。但是,如果用户搜索Lewis SmithJoe Clay

,也会找到该案例

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

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

1 个答案:

答案 0 :(得分:0)

Lucene将相同的字段中的连续添加添加到同一文档中,直到其在该字段中已有的结尾。

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

如果您只想搜索精确的文字"Foo Snafu",可以使用PhraseQuery。如果您想确保您的phrasequery不会从一个列表项跨越到下一个列表项(即,如果索引中有"Bar Foo""Snafu Bar"),则可以在两者之间插入某种形式的分隔术语写入索引时的每个成员。