如何在Hibernate搜索中搜索两个术语并在结果中同时获得它们?
在Hibernate搜索中,有没有办法找到所有搜索词的结果?我的意思是,例如,我搜索一个给定的术语,比如“房子”,我得到了一个“房子”的列表。然而,如果我想改进我的搜索并查找“house”和“pool”,我希望得到“house”和“pool”的列表,而不是“house”或“pool”的列表。 我不太清楚。所以,基本上,我需要的是用一个以上的词进行搜索,搜索必须考虑它们,而不仅仅是一个。 可能吗?如何在Hibernate搜索中搜索两个术语并在结果中同时获得它们?,hibernate,full-text-search,hibernate-search,Hibernate,Full Text Search,Hibernate Search,在Hibernate搜索中,有没有办法找到所有搜索词的结果?我的意思是,例如,我搜索一个给定的术语,比如“房子”,我得到了一个“房子”的列表。然而,如果我想改进我的搜索并查找“house”和“pool”,我希望得到“house”和“pool”的列表,而不是“house”或“pool”的列表。 我不太清楚。所以,基本上,我需要的是用一个以上的词进行搜索,搜索必须考虑它们,而不仅仅是一个。 可能吗? 谢谢假设您有一个要搜索的术语字符串数组,那么这可能就是您想要的 BooleanQuery final
谢谢假设您有一个要搜索的术语字符串数组,那么这可能就是您想要的
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);
BooleanQuery finalLuceneQuery=new BooleanQuery();
for(字符串术语:术语)
{
TermQuery query=新TermQuery(新术语(“您的搜索字段”,术语));
finalLuceneQuery.add(query,BooleanClause.occurrent.MUST);
}
FullTextQuery FullTextQuery=fullTextSession.createFullTextQuery(finalLuceneQuery.class);
干杯。假设您有一个要搜索的术语字符串数组,那么这可能就是您想要的
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);
BooleanQuery finalLuceneQuery=new BooleanQuery();
for(字符串术语:术语)
{
TermQuery query=新TermQuery(新术语(“您的搜索字段”,术语));
finalLuceneQuery.add(query,BooleanClause.occurrent.MUST);
}
FullTextQuery FullTextQuery=fullTextSession.createFullTextQuery(finalLuceneQuery.class);
干杯。您可以将默认运算符设置为并使用QueryParser:
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);
您可以使用QueryParser将默认运算符设置为和:
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);
搜索多个字段时,可以指定必须、应该或不必须出现在每个字段中的术语。以下代码基于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查询的另一种方法(可能更简单?):
搜索多个字段时,可以指定必须、应该或不必须出现在每个字段中的术语。以下代码基于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查询的另一种方法(可能更简单?):
这里不需要使用任何
分析器
,因为Hibernate隐式使用标准分析器
,它将根据空格
分割单词,因此这里的解决方案是在字段上将分析
设置为否
,它将自动执行多短语搜索
@Column(name="skill")
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@Analyzer(definition="SkillsAnalyzer")
private String skill;
这里不需要使用任何
分析器
,因为Hibernate隐式使用标准分析器
,它将根据空格
分割单词,因此这里的解决方案是在字段上将分析
设置为否
,它将自动执行多短语搜索
@Column(name="skill")
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@Analyzer(definition="SkillsAnalyzer")
private String skill;
在查询生成过程中使用关键字MUST。Hibernate Search还支持使用各种策略组合查询: -应:查询应包含子查询的匹配元素 -必须:查询必须包含子查询的匹配元素 -不能:查询不能包含子查询的匹配元素 聚合类似于布尔值的AND、OR和NOT
Query combinedQuery = queryBuilder
.bool()
.must(queryBuilder.phrase()
.onField("productName).sentence("samsung galaxy s8")
.createQuery())
.must(queryBuilder.keyword()
.onField("productCategory").matching("smartphone")
.createQuery())
.createQuery();
// wrap Lucene query in an Hibernate Query object
org.hibernate.search.jpa.FullTextQuery jpaQuery =
fullTextEntityManager.createFullTextQuery(combinedQuery, Product.class);
// execute search and return results (sorted by relevance as default)
@SuppressWarnings("unchecked")
List<Product> results = jpaQuery.getResultList();
Query combinedQuery=queryBuilder
.bool()
.must(queryBuilder.phrase()
.onField(“productName”).句(“三星galaxy s8”)
.createQuery())
.must(queryBuilder.keyword())
.onField(“产品类别”).matching(“智能手机”)
.createQuery())
.createQuery();
//在Hibernate查询对象中包装Lucene查询
org.hibernate.search.jpa.FullTextQuery jpaQuery=
fullTextEntityManager.createFullTextQuery(combinedQuery,Product.class);
//执行搜索并返回结果(默认情况下按相关性排序)
@抑制警告(“未选中”)
List results=jpaQuery.getResultList();
此参考可从链接中获得。在查询生成过程中使用关键字MUST。Hibernate Search还支持使用各种策略组合查询: -应:查询应包含子查询的匹配元素 -必须:查询必须包含子查询的匹配元素 -不能:查询不能包含子查询的匹配元素 聚合类似于布尔值的AND、OR和NOT
Query combinedQuery = queryBuilder
.bool()
.must(queryBuilder.phrase()
.onField("productName).sentence("samsung galaxy s8")
.createQuery())
.must(queryBuilder.keyword()
.onField("productCategory").matching("smartphone")
.createQuery())
.createQuery();
// wrap Lucene query in an Hibernate Query object
org.hibernate.search.jpa.FullTextQuery jpaQuery =
fullTextEntityManager.createFullTextQuery(combinedQuery, Product.class);
// execute search and return results (sorted by relevance as default)
@SuppressWarnings("unchecked")
List<Product> results = jpaQuery.getResultList();
Query combinedQuery=queryBuilder
.bool()
.must(queryBuilder.phrase()
.onField(“productName”).句(“三星galaxy s8”)
.createQuery())
.must(queryBuilder.keyword())
.onField(“产品类别”).matching(“智能手机”)
.createQuery())
.createQuery();
//在Hibernate查询对象中包装Lucene查询
org.hibernate.search.jpa.FullTextQuery jpaQuery=
fullTextEntityManager.createFullTextQuery(combinedQuery,Product.class);
//执行搜索并返回结果(默认情况下按相关性排序)
@抑制警告(“未选中”)
List results=jpaQuery.getResultList();
此参考从链接中获取