Elasticsearch java api 基本搜索部分詳解


文檔是結合幾個博客整理出來的,內容大部分為轉載內容。在使用過程中,對一些疑問點進行了整理與解析。

Elasticsearch java api 基本搜索部分詳解

ElasticSearch 常用的查詢過濾語句

一、所使用版本的介紹

使用的是elasticsearch2.4.3版本,在此只是簡單介紹搜索部分的api使用

二、簡單的搜索

使用api的時候,基本上可以將DSL搜索的所有情況均寫出來,在此給出一個最簡單搜索的全部的過程以及代碼,之后將對不同的搜索只是針對函數進行介紹

(1)DSL搜索

 

對於最簡單的DSL搜索,對一個詞進行搜索使用url直接進行通信,例如,如果對於一個字段,

搜索具體的一個term或者query,DSL如下所示:

 

{“query”:{"term":{"title":"molong1208 blog"}}}

 

這個搜索的含義是:在title字段,搜索內容為molong1208 blog;上面是DSL的寫法,實際上對於簡單的查詢,也可以直接使用url查詢,不帶json格式,假設我們所使用的服務器ip是localhost,對於如上的查詢可以寫為: 

 

localhost:9200/index/type/_search? q=title:molong1208 blog

 

這個寫法與上邊的DSL語言是同樣的功能的,但是這種寫法只是一些簡單的查詢才可以用,例如顯示想要的字段,按照某一字段排序等

 

localhost:9200/index/type/_search? q=title:molong1208 blog&fields=name,title&sort=id:desc&pretty=true

 

上述url的意思就是在index/type里面的title字段搜索內容,並且顯示的字段為name以及title,按照id降序排序,輸出的格式為美化的json格式

 

(2)使用java api 實現簡單搜索

 

1、建立連接

java api使用搜索的時候,必須先進行連接,在直接url的時候是端口9200,但是在使用程序的時候為9300,如下所示,建立客戶端的連接,在connection類里面給出初始化函數

 1     private static void open()  
 2         {  
 3                 Settings settings = Settings.settingsBuilder()  
 4                         .put("cluster.name", "molong").build();  
 5                           
 6                 try {  
 7                     client =  TransportClient.builder().settings(settings).build()  
 8                             .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));  
 9                 } catch (UnknownHostException e) {  
10                     // TODO Auto-generated catch block  
11                     e.printStackTrace();  
12                 }  
13       
14         }  

在此使用的是TransportClient連接,還有一個Nodeclient,沒使用過,在此不做介紹

2、進行查詢

查詢的時候,需要建立一個SearchRequestBuilder,這里面將給出對於哪一個index或者type進行查詢,並且所有的設置都可以在這里面進行實現,例如模糊查詢,范圍查詢,前綴查詢等

SearchRequestBuilder responsebuilder = client.prepareSearch("index").setTypes("type") 

 

上述代碼的意思是對於index的type進行查詢,其中client即使得到的建立鏈接,下一步就是要將查詢詞給進去

    SearchResponse myresponse=responsebuilder.setQuery(
    		QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))  
    .setFrom(0).setSize(10).setExplain(true).execute().actionGet();  

3、展示

    SearchHits hits = myresponse.getHits();  
    for (int i = 0; i < hits.getHits().length; i++) {  
               System.out.println(hits.getHits()[i].getSourceAsString());}  

4、常用的方法說明

setFrom(0):類似於分頁的下標、索引,默認為0
setSize(10):分頁的每頁展示的數量,默認為10

三、搜索時其他api的實現

讀DSL的時候我們可以看到,查詢有很多的查詢,比如說多域,比如說過濾等查詢條件,下面就針對 Elasticsearch服務器開發中一些基本查詢的DSL給出在java api實現的一些形式,其中很多形式不同的之處只是上述塞查詢詞時候的setQuery里面的不同,所以在此只是講述里面的函數不同

(1)基本查詢

1         SearchResponse myresponse=responsebuilder.setQuery(                
2                 //1.基本查詢
3                 QueryBuilders.matchPhraseQuery("name", "岳雲鵬18")                
4                 )  
5                 .setFrom(0).setSize(10)
6 //                .setExplain(true)
7                 .execute().actionGet();  

matchPhraseQuery(String name, Object text):name表示字段名稱,text表示字段所對應的內容。

(2)多詞條查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //2.多詞條查詢 ?
3                 //term主要用於精確匹配哪些值,比如數字,日期,布爾值或 not_analyzed 的字符串(未經分析的文本數據類型): 
4                 QueryBuilders.termsQuery("levle","3","2")            
5                 )  
6                 .setFrom(0).setSize(10)
7 //                .setExplain(true)
8                 .execute().actionGet();  

term主要用於精確匹配哪些值,比如數字,日期,布爾值或 not_analyzed 的字符串(未經分析的文本數據類型)

詳情參考:ElasticSearch 常用的查詢過濾語句

(3)match_all查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //3.查詢全部
3                 QueryBuilders.matchAllQuery()          
4                 )  
5                 .setFrom(0).setSize(100)
6 //                .setExplain(true)
7                 .execute().actionGet();  

有點類似於mysql語法:select * from tableName

(4)常用詞查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //4.常用詞查詢
3                 QueryBuilders.commonTermsQuery("name", "岳雲鵬18")        
4                 )  
5                 .setFrom(0).setSize(100)
6 //                .setExplain(true)
7                 .execute().actionGet();  

個人覺得與(1)基本查詢matchPhraseQuery(String name, Object text)類似

(5)match查詢

只使用過matchPhraseQuery函數,具體用法見上述所示

(6)multi_match查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //6.multiMatchQuery(text,fields)其中的fields是字段的名字,可以寫好幾個,每一個中間用逗號分隔 
3                 QueryBuilders.multiMatchQuery("13", "name","address")    
4                 )  
5                 .setFrom(0).setSize(100)
6 //                .setExplain(true)
7                 .execute().actionGet();  

multiMatchQuery(Object text, String... fieldNames):text為文本值,fieldNames為字段名稱。

舉例說明:name、address為字段名稱,13為文本值。查詢name字段或者address字段文本值為13的結果集。

(7)query_string查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //7.query_string查詢 (所有字段內容包含以下文本的)
3                 QueryBuilders.queryStringQuery("13")
4                 )  
5                 .setFrom(0).setSize(100)
6 //                .setExplain(true)
7                 .execute().actionGet(); 

查詢任意字段文本值為13的結果集。multi_match為指定某幾個字段,query_string是查所有的字段。

(8)simple_query_string查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //8.simple_query_string查詢
3                 QueryBuilders.simpleQueryStringQuery("13")
4                 )  
5                 .setFrom(0).setSize(100)
6 //                .setExplain(true)
7                 .execute().actionGet(); 

個人覺得與query_string沒太大區別,感興趣的可以深入研究

(9)標識符查詢

這個沒有研究,直接語法有興趣的可以深入研究

GetResponse getresponse = client.prepareGet("users", "user", "3").get();

(10)前綴查詢

1 SearchResponse myresponse=responsebuilder.setQuery(                
2                 //8.前綴查詢 (一個漢字,字符小寫)
3 //                QueryBuilders.prefixQuery("name", "雲")
4                 QueryBuilders.prefixQuery("name", "12")
5                 )  
6                 .setFrom(0).setSize(100)
7 //                .setExplain(true)
8                 .execute().actionGet();  

詳情參考:ElasticSearch 常用的查詢過濾語句

 

(11)fuzzy_like_this,fuzzy_like_this_field,fuzzy查詢

 

SearchResponse myresponse=responsebuilder.setQuery(      
                //9.fuzzy_like_this,fuzzy_like_this_field,fuzzy查詢
                //fuzzyQuery:使用模糊查詢匹配文檔查詢
                QueryBuilders.fuzzyQuery("name", "鵬16")
                )  
                .setFrom(0).setSize(100)
//                .setExplain(true)
                .execute().actionGet();  

只發現了這個方法fuzzyQuery(String name, String value),也許高版本的會有其他方法

(12)通配符查詢

wildcard查詢和prefix查詢類似,也是一個基於詞條的低級別查詢。但是它能夠讓你指定一個模式(Pattern),而不是一個前綴(Prefix)。它使用標准的shell通配符:?用來匹配任意字符,*用來匹配零個或者多個字符。

1 SearchResponse myresponse=responsebuilder.setQuery(      
2                 
3                 //10.通配符查詢 ?用來匹配任意字符,*用來匹配零個或者多個字符
4 //                QueryBuilders.wildcardQuery("name", "岳*")
5                 QueryBuilders.wildcardQuery("createTime", "?ue*")
6                 )  
7                 .setFrom(0).setSize(100)
8 //                .setExplain(true)
9                 .execute().actionGet();  

有一點需要注意的是:由於?用來匹配字符的,而非字符串。查詢中文的使用?是無效的。

(13)more_like_this,more_like_this_field

 

    responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery().addLikeText("long"))  

 

    responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery("long"))  

 詳情參考:http://blog.csdn.net/lu_wei_wei/article/details/51088125

(14)rang查詢

range過濾允許我們按照指定范圍查找一批數據

范圍操作符包含:

  • gt :: 大於
  • gte:: 大於等於
  • lt :: 小於
  • lte:: 小於等於
1         SearchResponse myresponse=responsebuilder.setQuery(      
2                 
3                 //12.rang查詢
4                 QueryBuilders.rangeQuery("age").gt(10).lt(20)                
5                 )  
6                 .setFrom(0).setSize(100)
7 //                .setExplain(true)
8                 .execute().actionGet();  

(15)dismax查詢

 將子查詢union 到一起,沒個文檔的分數是 子查詢中相同文檔的得分最大值。 
例: 北京大飯店 酒索引得分 0; 店 得分 1; 大得分1.1 最后的結果是 北京大飯店相關度得分1.1   
    QueryBuilders.disMaxQuery()  
        .add(QueryBuilders.termQuery("hotelName","酒"))  
        .add(QueryBuilders.termQuery("hotelName","店"))  
        .add(QueryBuilders.termQuery("hotelName","大"));  
 
        

(16)正則表達式查詢

1         SearchResponse myresponse=responsebuilder.setQuery(      
2                 
3                 //14.正則表達式查詢                    
4                 QueryBuilders.regexpQuery("createTime", "dec.*")                
5                 )  
6                 .setFrom(0).setSize(100)
7 //                .setExplain(true)
8                 .execute().actionGet(); 

 

注意

prefix,wildcard以及regexp查詢基於詞條進行操作。如果你在一個analyzed字段上使用了它們,它們會檢查字段中的每個詞條,而不是整個字段。

比如,假設我們的title字段中含有"Quick brown fox",它會產生詞條quick,brown和fox。

這個查詢能夠匹配:

{ "regexp": { "title": "br.*" }}

而不會匹配:

{ "regexp": { "title": "Qu.*" }} 
{ "regexp": { "title": "quick br*" }}
 Elasticsearch正則表達式語法: https://www.cnblogs.com/xing901022/p/6797597.html

四、bool查詢

bool 過濾可以用來合並多個過濾條件查詢結果的布爾邏輯,它包含一下操作符:

  • must :: 多個查詢條件的完全匹配,相當於 and。
  • must_not :: 多個查詢條件的相反匹配,相當於 not。
  • should :: 至少有一個查詢條件匹配, 相當於 or。
 1  SearchResponse myresponse=responsebuilder.setQuery(      
 2                 
 3                 //15.bool查詢                
 4                 QueryBuilders.boolQuery()
 5                 .must(QueryBuilders.multiMatchQuery("13", "name"))
 6                 .must(QueryBuilders.multiMatchQuery("13", "address"))            
 7                 )  
 8                 .setFrom(0).setSize(100)
 9 //                .setExplain(true)
10                 .execute().actionGet();  

multiMatchQuery(Object text, String... fieldNames)用法參考(6)multi_match查詢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM