需求是在保留在單獨的單個表中的有限數量的字段上構建簡化的搜索功能。使用Solr或類似的東西目前不是一種選擇,所有東西都必須在一個webapp中工作。數據庫是MSSQL。我想要做的就是利用Lucene查詢解析器並從中構建Hibernate條件。儘管我最初的印象是它不會太難,但我無法弄清楚如何爲複雜查詢構建標準。使用Lucene解析搜索查詢並基於該搜索查詢生成Hibernate條件
下面是一個簡單的測試,我創建瞭解析與Lucene的查詢字符串(4.7.2)
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
QueryParser luceneParser = new QueryParser(Version.LUCENE_47, "", analyzer);
String queryString = "(name:\"Luke Skywalker\" AND father:unknown OR fname:Luke) or (name:yoda)";
Query luceneQuery = luceneParser.parse(queryString);
....
public class QueryInterpreter {
public void parse(Query query) {
if (query instanceof TermQuery) {
termQuery((TermQuery) query);
} else if (query instanceof BooleanQuery) {
booleanQuery((BooleanQuery) query);
} else if (query instanceof PhraseQuery) {
phraseQuery((PhraseQuery) query);
} else {
throw new IllegalArgumentException("");
}
}
public void booleanQuery(BooleanQuery query) {
for (BooleanClause clause : query.getClauses()) {
parse(clause.getQuery());
}
}
public void phraseQuery(PhraseQuery query) {
StringBuilder sb = new StringBuilder();
for (Term term : query.getTerms()) {
sb.append(term.text());
sb.append(" ");
}
}
public void termQuery(TermQuery query) {
Term term = query.getTerm();
}
}
Lucene的第一件事覆羽的搜索字符串(+name:\"Luke Skywalker\" +father:unknown fname:Luke) name:yoda
。基本上,它通過爲每個條件設置isRequired()來迭代條件。 Hibernate的工作方式不同 - 您創建一個標準對象並繼續添加具有值對的Criterions。我無法弄清楚如何將一個轉換爲另一個。我認爲我需要的是一個通用的Junction對象來附加Criterions。