ElasticSearch是基於lucene的開源搜索引擎,它的查詢語法關鍵字跟lucene一樣,如下:
- 分頁:from/size
- 字段:fields
- 排序:sort
- 查詢:query
- 過濾:filter
- 高亮:highlight
- 統計:facet
參考資料:
http://blog.csdn.net/lgnlgn/article/details/8053626
查詢:query
對於每個查詢項,我們可以通過must、should、mustNot方法對QueryBuilder進行組合,形成多條件查詢。(must=>and,should=>or)
Lucene支持基於詞條的TermQuery、RangeQuery、PrefixQuery、BolleanQuery、PhraseQuery、WildcardQuery、FuzzyQuery
1.TermQuery與QueryParser
單個單詞作為查詢表達式時,它相當於一個單獨的項。如果表達式是由單個單詞構成,QueryParser的parse()方法會返回一個TermQuery對象。
如查詢表達式為:content:hello,QueryParser會返回一個域為content,值為hello的TermQuery。
Query query = new TermQuery(“content”, “hello”).
2.RangeQuery與QueryParser
QueryParse可以使用[起始TO 終止]或{起始TO 終止}表達式來構造RangeQuery。
如查詢表達式為:time:[20101010 TO 20101210] ,QueryParser會返回一個域為time,下限為20101010,上限為20101210的RangeQuery。
Term t1 = new Term(“time”, “20101010”);
Term t2 = new Term(“time”, “20101210”);
Query query = new RangeQuery(t1, t2, true);
3.PrefixQuery與QueryParser
當查詢表達式中短語以星號(*)結尾時,QueryParser會創建一個PrefixQuery對象。
如查詢表達式為:content:luc*,則QueryParser會返回一個域為content,值為luc的PrefixQuery.
Query query = new PrefixQuery(luc);
4.BooleanQuery與QueryParser
當查詢表達式中包含多個項時,QueryParser可以方便的構建BooleanQuery。QueryParser使用圓括號分組,通過-,+,AND, OR及NOT來指定所生成的Boolean Query。
5.PhraseQuery與QueryParser
在QueryParser的分析表達式中雙引號的若干項會被轉換為一個PhraseQuery對象,默認情況下,Slop因子為0,可以在表達式中通過~n來指定slop因子的值。
如查詢表達式為content:“hello world”~3,則QueryParser會返回一個域為content,內容為“hello world”,slop為3的短語查詢。
Query query = new PhraseQuery();
query.setSlop(3);
query.add(new Term(“content”, “hello”);
query.add(new Term(“content”, “world”);
6. Wildcard與QueryParser
Lucene使用兩個標准的通配符號,*代表0或多個字母,?代表0或1個字母。但查詢表達式中包含*或?時,則QueryParser會返回一個WildcardQuery對象。但要注意的是,當*出現在查詢表達式的末尾時,會被優化為PrefixQuery;並且查詢表達式的首個字符不能是通配符,防止用戶輸入以通配符*為前綴的搜索表達式,導致lucene枚舉所有的項而耗費巨大的資源。
6.FuzzyQuery和QueryParser
QueryParser通過在某個項之后添加“~”來支持FuzzyQuery類的模糊查詢。
參考:
