Hibernate Search 3.1.1 - 如何以任何顺序在字段上搜索相同短语中的多个单词

时间:2014-04-11 04:55:30

标签: java hibernate search lucene hibernate-search

我已经将hibernate search 3.1.1与我现有的应用程序集成在Spring 2.5和Hibernate核心3.3.2 GA中。使用hibernate-search-3.1.1,我使用的是apache lucene 2.4.1。

我面临的问题是当我按顺序搜索单个单词或多个单词时,它会完美搜索并返回结果但是当我用空格搜索多个单词时,它不会返回任何结果。例如,如果我有一个索引为

的文本

"你好世界!"

现在如果我搜索"你好"或者"伟大的世界",它会成功返回结果,但如果我搜索"世界你好",它就不会返回结果。

我想要的是,如果任何完整或部分单词与索引文本匹配,则能够返回结果。我的源代码如下:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);

// create native Lucene query
String[] fields = new String[] { "text", "description", "standard.title", "standard.briefPurpose", "standard.name" };
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
org.apache.lucene.search.Query query = null;

try {
    query = parser.parse(searchTerm);
} catch (ParseException e) {
    e.printStackTrace();
}

// wrap Lucene query in a javax.persistence.Query
FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Requirement.class);

// execute search
@SuppressWarnings("unchecked")
List<Requirement> result = persistenceQuery.getResultList();

return result;

如果我需要添加任何东西来支持我想要的东西,请提供帮助。

2 个答案:

答案 0 :(得分:2)

我知道它很老的问题。但对于其他这个简短的描述可能会有所帮助。

您应该在pojo类中使用带有analyze = Analyze.YES注释的@Field属性。它将该字段的字符串值分成标记,即分成单个字。所以你可以按任何顺序搜索。但请注意,你必须进入整个世界。例如,搜索“美国”可以找到'美国','国家','美国联合','美国联合'等。但是Hibernate搜索需要整个单词。只有'Uni'不起作用。

修改

对于旧版本的Hibernate Search Apis:

必须使用Index.TOKENIZED代替analyze = Analyze.YES和@Field注释。

答案 1 :(得分:0)

您是否尝试过使用PhraseQuery.setSlop(int)?这应该允许单词重新排序。有关详细信息,请查看Javadoc