如何在Hibernate搜索中搜索两个术语并在结果中同时获得它们?

如何在Hibernate搜索中搜索两个术语并在结果中同时获得它们?,hibernate,full-text-search,hibernate-search,Hibernate,Full Text Search,Hibernate Search,在Hibernate搜索中,有没有办法找到所有搜索词的结果?我的意思是,例如,我搜索一个给定的术语,比如“房子”,我得到了一个“房子”的列表。然而,如果我想改进我的搜索并查找“house”和“pool”,我希望得到“house”和“pool”的列表,而不是“house”或“pool”的列表。 我不太清楚。所以,基本上,我需要的是用一个以上的词进行搜索,搜索必须考虑它们,而不仅仅是一个。 可能吗? 谢谢假设您有一个要搜索的术语字符串数组,那么这可能就是您想要的 BooleanQuery final

在Hibernate搜索中,有没有办法找到所有搜索词的结果?我的意思是,例如,我搜索一个给定的术语,比如“房子”,我得到了一个“房子”的列表。然而,如果我想改进我的搜索并查找“house”和“pool”,我希望得到“house”和“pool”的列表,而不是“house”或“pool”的列表。 我不太清楚。所以,基本上,我需要的是用一个以上的词进行搜索,搜索必须考虑它们,而不仅仅是一个。 可能吗?
谢谢

假设您有一个要搜索的术语字符串数组,那么这可能就是您想要的

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();
此参考从链接中获取