休眠搜索3.1.1-如何在一个字段中以任何顺序搜索同一短语中的多个单词



我已经将hibernate搜索3.1.1与我现有的应用程序与Spring 2.5和hibernate core 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;

如果我需要添加任何东西来支持我的愿望,请帮忙。

我知道这个问题很古老。但对其他人来说,这个简短的描述可能会有所帮助。

您应该在pojo类中使用带有@Field注释的analyze = Analyze.YES属性。它将该字段的字符串值划分为标记,即划分为单个单词。所以你可以按任何顺序搜索。但请注意,你们必须进入整个世界。例如,搜索"美利坚合众国"可以用"America"、"States"、"United States"one_answers"America United"等词找到。但Hibernate搜索需要完整的单词。只有"Uni"不起作用。

编辑:

对于旧版本的Hibernate搜索Apis:

必须使用Index.TOKENIZED而不是带有@Field注释的analyze = Analyze.YES

您尝试过使用PhraseQuery.setSlop(int)吗?这应该允许单词重新排序。查看Javadoc了解更多信息。

最新更新