[英]Boolean queries in Hibernate Search
我試圖了解Hibernate Search中的一般查詢。 我在理解forEntity(...)
方法時遇到了一些麻煩。 這就是文檔所說的:
讓我們看看如何使用API。 首先,您需要創建一個附加到給定索引實體類型的查詢構建器。 該QueryBuilder將知道要使用的分析器以及要應用的字段橋。 您可以創建多個QueryBuilder(對於查詢根目錄中涉及的每種實體類型,一個)。 您可以從SearchFactory獲得QueryBuilder。
從節: 5.1.2。 使用Hibernate Search查詢DSL構建Lucene查詢
QueryBuilder mythQB = searchFactory.buildQueryBuilder().forEntity( Myth.class ).get();
從上方可以看到您必須命名一個實體。 要創建自己的querybuilder以便在“根”查詢中創建布爾查詢時應該做什么? 您還應該綁定什么?
假設我想要一個布爾查詢,該查詢應匹配“ Apples”或“ Pie”。 那是兩個不同的實體,所以目前我有兩個不同的查詢構建器。 但是我需要第三個來創建布爾查詢。 這應該綁定到Object
類嗎?
如果您希望能夠從單個查詢返回多個實體,則可以按照您的說明使用QueryBuilder
,但是您需要在createFullTextQuery
調用中指定多個實體。 例如,如果您具有Book
實體和Movie
實體,並且想要查找標題以d
開頭的所有書籍和電影,則可以使用以下查詢:
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Book.class).get();
Query query = queryBuilder.keyword().wildcard().onField("title").matching("d*").createQuery();
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(query, Book.class, Movie.class);
注意,查詢構建器僅使用Book
實體創建,但是Book
和Movie
都在createFullTextQuery
調用中指定。
由於在Lucene API和文檔中具有布爾名稱,因此調用布爾運算符應該代替OR,因為它更合適:它不僅影響布爾決策,而且還影響結果的評分。
例如,如果您搜索“菲亞特品牌”或“藍色”汽車,則菲亞特AND藍色品牌的汽車也將被退回,並且比藍色但菲亞特汽車的得分更高。
由於它具有程序性並提供許多詳細的選項,因此可能會很麻煩。 一種更簡單的選擇是對查詢使用簡單的字符串,然后使用QueryParser創建查詢。 通常,解析器對解析用戶輸入很有用,而編程式解析器更易於處理定義明確的字段; 例如,如果您有提到的集合,則很容易在for循環中構建它。
Collection<String> namesCollection = getNames(); // Contains "billy" and "bob", for example
StringBuilder names = new StringBuilder(100);
for(String name : namesCollection) {
names.append(name).append(" "); // Never mind the space at the end of the resulting string.
}
QueryBuilder b = fts.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
Query luceneQuery = b.bool()
.should(
// Searches for multiple possible values in the same field
b.keyword().onField("firstName").matching( sb.toString() ).createQuery()
)
.must(b.keyword().onField("lastName").matching("thornton").createQuery())
.createQuery();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.