我有一个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),那么“增量差距可确保同一字段中的不同值不会导致意外匹配”。
答案 0 :(得分:0)
Lucene将相同的字段中的连续添加添加到同一文档中,直到其在该字段中已有的结尾。
如果要将List的每个成员视为完全独立的实体,则应将它们编入不同的字段中。您可以将索引附加到您正在使用的字段名称。虽然我没有关于您需求的完整信息,但当然,做这样的事情可能是更好的解决方案。
如果您只想搜索精确的文字"Foo Snafu"
,可以使用PhraseQuery。如果您想确保您的phrasequery不会从一个列表项跨越到下一个列表项(即,如果索引中有"Bar Foo"
和"Snafu Bar"
),则可以在两者之间插入某种形式的分隔术语写入索引时的每个成员。