簡體   English   中英

Hibernate Search中的布爾查詢

[英]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實體創建,但是BookMovie都在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM