如何配置lucene + hibernate並開發與該字段值的任何確切部分匹配某個字段的通配符查詢?例如,如果我們有一些字段「標題」被索引,並且只有兩個條目:「我的第一個通配符查詢」。和「我的第二個通配符查詢」。那麼如果我們查詢「irsT WiLdCaRd q」,那麼它只能返回第一個。也不一定要區分大小寫。冬眠搜索通配短語查詢
我已經試過這樣的事情:
FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession((Session) em.getDelegate());
QueryContextBuilder qbc = ftSession.getSearchFactory().buildQueryBuilder();
EntityContext entityContext = qbc.forEntity(Book.class);
QueryBuilder qb = entityContext.get();
org.apache.lucene.search.Query q = qb.keyword().wildcard().onField("title")
.ignoreAnalyzer().matching("*" + QueryParser.escape("irsT WiLdCaRd q").toLowerCase() + "*").createQuery();
FullTextEntityManager ftEm = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
final FullTextQuery ftq = ftEm.createFullTextQuery(q, Book.class);
List list = ftq.getResultList();
和它不工作,因爲它是面向關鍵字和有通配符詞組沒有模擬。使用直接WildcardQuery也不起作用(
Lucene實際上對短語查詢中的通配符有一些支持,請參閱https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/MultiPhraseQuery.html。我不確定查詢解析器是否可以構建這些類型的查詢。 –
@DanielNaber是的,我以前就遇到過這種情況。但是,這並不足以支持我的想法,因爲它需要您手動列舉所有帶有該前綴的術語,以及4.0.0文檔中「MultiPhraseQuery」中列出的方法來完成該操作,即IndexReader.terms(Term )'在4.0.0中不再存在,或至少不再有文檔記錄。我會說Lucene在短語查詢中不支持通配符(你仍然不會在查詢中傳遞通配符,而是自己定義通配符邏輯),但是它們確實記錄了可能用於獲得相同結果的黑客行爲。 – femtoRgon