Java Hibernate列表字段上的Lucene搜索
我有一个Hibernate注释类Java Hibernate列表字段上的Lucene搜索,java,hibernate,jpa,lucene,Java,Hibernate,Jpa,Lucene,我有一个Hibernate注释类TestClass,它包含一个List字段,我正在用Lucene索引该字段。考虑下面的例子: “Foo Bar”和“Bar Snafu”是特定记录列表中的两个条目。现在,如果用户在TestClass上搜索“Foo Snafu”,那么就会找到记录,我猜是因为标记Foo和标记Snafu都是该记录的列表中的标记 有什么方法可以防止这种情况发生吗 现实世界的例子是一个有原告和被告名单的法庭案件。假设有两个人被起诉,乔·刘易斯·鲍勃和罗伯特·克莱·史密斯。这些用户存储在被告
TestClass
,它包含一个List
字段,我正在用Lucene索引该字段。考虑下面的例子:
“Foo Bar”
和“Bar Snafu”
是特定记录列表中的两个条目。现在,如果用户在TestClass上搜索“Foo Snafu”
,那么就会找到记录,我猜是因为标记Foo和标记Snafu都是该记录的列表中的标记
有什么方法可以防止这种情况发生吗
现实世界的例子是一个有原告和被告名单的法庭案件。假设有两个人被起诉,乔·刘易斯·鲍勃和罗伯特·克莱·史密斯。这些用户存储在被告名单中的法庭案件记录中。这张被告名单用Lucene索引。现在,如果用户搜索前面提到的两个被告中的任何一个,案件就会被找到。但如果用户搜索刘易斯·史密斯
,或乔·克莱
,也会发现这种情况
更新:在Lucene IRC频道中提到,我可以使用多值字段
更新2:在Solr IRC频道中提到,我可以使用schema.xml
中的positionIncrementGap
设置来实现这一点。显然,如果我使用短语查询(带或不带slop),那么“增量间隔确保同一字段中的不同值不会导致意外匹配”。Lucene将连续添加到同一文档中的同一字段,并将其添加到字段中已有的内容的末尾
如果要将列表中的每个成员视为一个完全独立的实体,则应在不同的字段中为其编制索引。您可以将索引附加到已使用的字段名。当然,虽然我没有关于您需求的完整信息,但这样做可能是更好的解决方案
如果您只想搜索精确的文本“Foo Snafu”
,可以使用。如果您想确保短语查询不会从一个列表项跨到下一个列表项(即,如果索引中有“Bar Foo”
和“Snafu Bar”
),则可以在写入索引时在每个成员之间插入某种形式的定界词。如果它是一个列表,并且“Foo Bar”和“Bar Snafu”是不同的实体……那么请列出[i] .. 其中“i”是一个计数器变量。。。只会指向“foo bar”和“bar snafu”作为一个整体“foo snafu”不作为实体存在。。。就我理解你的问题而言,这是我能告诉你的。也许你可以详细说明一下?@Philo是的,但是Lucene正在标记所有隐藏的名称。我将无法使用不同的字段,因为特定记录的列表大小将是动态的。