如何在Hibernate Search中搜索两个术语并在结果中获取它们?

时间:2013-08-24 19:48:57

标签: hibernate full-text-search hibernate-search

有没有办法在Hibernate Search中找到所有搜索过的术语?我的意思是,例如,我搜索像“房子”这样的特定术语,我得到了一个“房屋”列表。但是,如果我想要改进我的搜索并寻找“房子”和“游泳池”,我想得到一个“房子”和“游泳池”列表,而不是“房子”或“游泳池”列表。 我不确定我是否足够清楚。所以,基本上,我需要的是用多个单词执行搜索,搜索必须全部考虑它们,而不仅仅是一个。 那可能吗? 感谢

5 个答案:

答案 0 :(得分:3)

也许这就是你想要的,假设你有一个String数组要搜索。

BooleanQuery finalLuceneQuery=new BooleanQuery();
for(String term:terms)
{
  TermQuery query = new TermQuery(new Term("your search field", term));

  finalLuceneQuery.add(query,BooleanClause.Occur.MUST);
}

FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(finalLuceneQuery, <your class>.class);

干杯。

答案 1 :(得分:2)

您可以使用QueryParser将默认运算符设置为AND:

QueryParser queryParser = new QueryParser(Version.LUCENE_36, "yourfield",standardAnalyzer);     
// query terms should ANDed by default
queryParser.setDefaultOperator(Operator.AND);
Query luceneQuery = queryParser.parse("house pool");
// turn it into an hibernate search query
org.hibernate.search.FullTextQuery hibQuery =
session.createFullTextQuery(luceneQuery, YourClass.class);

答案 2 :(得分:2)

在几个字段上搜索时,可以指定每个字段中必须出现的MUST,SHOULD或MUST_NOT条款。以下代码基于Lucene 4.10.3。

// fields we are interested in
String[] fields = {"description", "content"};
// terms SHOULD appear in description OR MUST appear in content
BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.MUST};
// besides the StandardAnalyzer there are analysers for many languages like
// FrenchAnalyser, RussianAnalyser and so on
Analyzer analyzer = new StandardAnalyzer();
// create a multi field query using parse static method
org.apache.lucene.search.Query luceneQuery = 
    MultiFieldQueryParser.parse("house pool", fields, flags, analyzer);
// convert to Hibernate query
org.hibernate.search.FullTextQuery hibQuery =
    session.createFullTextQuery(luceneQuery, YourClass.class);

如果使用JPA,则需要将其转换为JPA查询:

// get an EntityManager from your EntityManagerFactory (emf)
javax.persistence.EntityManager em = emf.createEntityManager();
// Convert it to a FullTextEntityManager
org.hibernate.search.jpa.FullTextEntityManager ftem =
    org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
// convert it to a JPA query
javax.persistence.Query jpaQuery =
    ftem.createFullTextQuery(luceneQuery, YourClass.class);

获取Lucene查询的另一种方法(可能更简单?):

// fields we are interested in
String[] fields = {"description", "content"};
// besides the StandardAnalyzer there are analysers for many languages like
// FrenchAnalyser, RussianAnalyser and so on
Analyzer analyzer = new StandardAnalyzer();
// to set MUST for all fields we need an instance of the parser
MultiFieldQueryParser mfqp = new MultiFieldQueryParser(fields, analyzer);
mfqp.setDefaultOperator(QueryParser.Operator.AND);
org.apache.lucene.search.Query luceneQuery = mfqp.parse("house pool");

答案 3 :(得分:0)

此处无需使用任何Analyzer因为Hibernate隐式使用StandardAnalyzer会根据white spaces拆分单词,因此此处的解决方案将Analyze设置为该字段NO会自动执行Multi Phrase Search

@Column(name="skill")
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@Analyzer(definition="SkillsAnalyzer")
private String skill;

答案 4 :(得分:0)

在查询构建期间使用关键字MUST。 Hibernate Search还支持使用各种策略组合查询:

-SHOULD:查询应该包含子查询的匹配元素

-MUST:查询必须包含子查询的匹配元素

-MUST NOT:查询不得包含子查询的匹配元素

聚合类似于布尔值AND,OR和NOT。

for(int i = 0; i <= strlength; i++)

此参考资料来自链接http://www.baeldung.com/hibernate-search