1

検索されたすべての用語を使用して Hibernate Search で結果を見つける方法はありますか? つまり、たとえば、「家」などの特定の用語を検索すると、「家」のリストが表示されます。ただし、検索を絞り込んで「家」と「プール」を探したい場合は、「家」または「プール」のリストではなく、「家」と「プール」のリストを取得したいと考えています。 . 私は十分に明確であるかどうかわかりません。したがって、基本的には、複数の単語で検索を実行する必要があり、検索では 1 つだけでなく、すべての単語を考慮する必要があります。それは可能ですか?ありがとう

4

5 に答える 5

4

検索する用語の文字列配列があると仮定すると、これが必要になる場合があります。

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);

乾杯。

于 2013-08-26T08:48:31.140 に答える
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);
于 2013-10-24T12:47:37.007 に答える
2

複数のフィールドで検索する場合、各フィールドに表示されなければならない、必要がある、または指定されていない用語を指定できます。次のコードは、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");
于 2015-01-09T22:57:51.543 に答える