ElasticSearch Java api 詳解_V1.0


/×××××××××××××××××××××××××××××××××××××××××/

Author:xxx0624

HomePage:http://www.cnblogs.com/xxx0624/

/×××××××××××××××××××××××××××××××××××××××××/

 

原英文文檔:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/index.html (各個版本的api)

這里有一個簡單的使用search的官方文檔:http://www.elastic.co/guide/en/elasticsearch/client/java-api/current/search.html#java-search-template

這是另外一個作者有關es api的翻譯http://blog.csdn.net/woshiyexinjie/article/details/41088705

Search部分:

查詢有兩種方法:query Java APIfilter Java API

首先看一個例子:

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.FilterBuilders.*;
import org.elasticsearch.index.query.QueryBuilders.*;

SearchResponse response = client.prepareSearch("index1", "index2")
         //設置要查詢的索引(index)
        .setTypes("type1", "type2")
         //設置type, 這個在建立索引的時候同時設置了, 或者可以使用head工具查看
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(QueryBuilders.termQuery("multi", "test"))             
        // Query 查詢之一. 對於QueryBuilders接下來會解釋. 在這里"multi"是要查詢的field,"test"是要查詢的內容
        .setFilter(FilterBuilders.rangeFilter("age").from(12).to(18))   
        // Filter 查詢之二, FilterBuilders接下來會解釋. 在這里"age"是要查詢的field, 后面的數字是查詢的條件范圍
        .setFrom(0).setSize(60).setExplain(true)
        //0-60 表示顯示數量
        .execute()
        .actionGet();

提示:以上所有參數都是可選的. 

最小的查詢如下所示:

// MatchAll on the whole cluster with all default options
SearchResponse response = client.prepareSearch().execute().actionGet();

 

1.query Java API

為了使用QueryBuilders必須先import下面的類:

import org.elasticsearch.index.query.QueryBuilders.*;

第一種:Match Query (鏈接內有詳細解釋)

QueryBuilder qb = QueryBuilders.matchQuery("name", "kimchy elasticsearch");
//name是field,kimchy elasticsearch是要查詢的字符串

第二種:MultiMatch Query (鏈接內有詳細解釋)

QueryBuilder qb = QueryBuilders.multiMatchQuery(
    "kimchy elasticsearch",     // Text you are looking for
     //kimchy elasticsearch是要查詢的字符串
    "user", "message"           // Fields you query on
     //user 和 message都是field
    );

第三種: Boolean Query (鏈接內有詳細解釋)

QueryBuilder qb = QueryBuilders
                    .boolQuery()
                    .must(termQuery("content", "test1"))
                    .must(termQuery("content", "test4"))
                    .mustNot(termQuery("content", "test2"))
                    .should(termQuery("content", "test3"));
//content為field,test為查詢內容.
//其中must表示必須滿足,mustNot表示必須不滿足,should表示可有可無

如果bool查詢語句中不存在must,則必須至少有一個should查詢,同時可以通過minimum_should_match參數來設置至少需要滿足的should個數.

Boosting Query

略...

IDs Query

QueryBuilders.idsQuery().ids("1", "2");
//通過id來查詢

Custom Score Query

略...

Custom Boost Factor Query

略...

Constant Score Query

略...

Disjunction Max Query

略...

Field Query

QueryBuilders.fieldQuery("name", "+kimchy -dadoonet");

// Note that you can write the same query using queryString query.
QueryBuilders.queryString("+kimchy -dadoonet").field("name");
//+表示必須有的 -表示一定沒有的 name表示查詢的filed

Fuzzy Like This Query * Fuzzy Like This Field Query

略....不懂.....

Fuzzy Query

QueryBuilder qb = QueryBuilders.fuzzyQuery("name", "kimzhy");
//根據提供的字符串作為前綴進行查詢

Has Child Query * Has Parent

略....不懂.....

Match All Query

QueryBuilder qb = QueryBuilders.matchAllQuery();
//顯示所有的記錄

More Like This Query * More Like This Field Query

略...不懂......

Prefix Query

QueryBuilders.prefixQuery("brand", "heine");
//brand是field, heine是前綴查詢字符串

QueryString Query

QueryBuilder qb = QueryBuilders.queryString("+kimchy -elasticsearch");

略....不懂.....

Range Query

QueryBuilder qb = QueryBuilders
                    .rangeQuery("price")
                    .from(5)
                    .to(10)
                    .includeLower(true)
                    .includeUpper(false);
//price是field, 數字代表范圍.除了from to還有lt gt等等...

Span First Query * Span Near Query * Span Not Query * Span Or Query * Span Term Quer// Span First

 

QueryBuilders.spanFirstQuery(
                QueryBuilders.spanTermQuery("user", "kimchy"),  // Query
                3                                               // Max End position
        );
//只匹配在Field開頭出現的, 數字表示從開頭起的幾個單詞內查詢, 則此查詢意思是:user中的開頭3個單詞內,kimchy是否能查詢到


// Span Near
QueryBuilders.spanNearQuery()
    .clause(QueryBuilders.spanTermQuery("field","value1"))  // Span Term Queries
    .clause(QueryBuilders.spanTermQuery("field","value2"))
    .clause(QueryBuilders.spanTermQuery("field","value3"))
    .slop(12)                                               // Slop factor
    .inOrder(false)
    .collectPayloads(false);
//匹配距離相近的, inOrder表示:true表示按照value1/2/3的順序來計算距離(兩個單詞中間夾一個單詞 距離為1). 舉例: a b c d.  {a,b,c}中a,c的距離為1.
//則此查詢的意思是:在field中,如果value1/2/3的距離是在12以內的,那么可以查詢到.反之不能.


// Span Not
QueryBuilders.spanNotQuery()
    .include(QueryBuilders.spanTermQuery("field","value1"))
    .exclude(QueryBuilders.spanTermQuery("field","value2"));
//匹配不重疊的,即除那些兩個SpanQuery相互重疊的結果
//例如有兩個Document:”the quick brown fox jump over a lazy dog”和”the quick red fox jumps over the sleepy cat”
//SpanNearQuery quick_fox =new SpanNearQuery(new SpanQuery[]{quick, fox}, 1, true);  //基礎的SpanQuery,默認匹配2個Document
//匹配的這兩個結果的中間重疊部分為:red/brown
//SpanNotQuery quick_fox_dog = new SpanNotQuery(quick_fox, dog);//因為dog不是red或者brown,所以仍為兩個
//SpanNotQuery no_quick_red_fox =      new SpanNotQuery(quick_fox, red);   //現在只剩下brown那個doc了
//這種Query經常用於連接的時候。

// Span Or
QueryBuilders.spanOrQuery()
    .clause(QueryBuilders.spanTermQuery("field","value1"))
    .clause(QueryBuilders.spanTermQuery("field","value2"))
    .clause(QueryBuilders.spanTermQuery("field","value3"));
//SpanQuery的合集


// Span Term
QueryBuilders.spanTermQuery("user","kimchy");


//該部分詳見:http://www.coder4.com/archives/774

 

Term Query

略...

Terms Query

略...

Top Children Query

略...

Wildcard Query

略...

Nested Query

略...

Custom Filters Score Query

略...

Indices Query

略...

GeoShape Query

略...

2.filter Java API

 

 

 

附上一個自己寫的小型Test, 簡單易懂.

  1 import java.io.IOException;
  2 
  3 import org.elasticsearch.action.index.IndexResponse;
  4 import org.elasticsearch.action.search.SearchResponse;
  5 import org.elasticsearch.action.search.SearchType;
  6 import org.elasticsearch.client.Client;
  7 import org.elasticsearch.client.transport.TransportClient;
  8 import org.elasticsearch.common.transport.InetSocketTransportAddress;
  9 import org.elasticsearch.common.xcontent.XContentBuilder;
 10 import org.elasticsearch.common.xcontent.XContentFactory;
 11 import org.elasticsearch.index.query.FilterBuilders;
 12 import org.elasticsearch.index.query.QueryBuilder;
 13 import org.elasticsearch.index.query.QueryBuilders;
 14 import org.elasticsearch.search.SearchHits;
 15 
 16 import user.User;
 17 
 18 
 19 public class First_ES_Test {
 20 
 21     private Client client;
 22     
 23     public void init()
 24     {
 25         //ip可以在http://localhost:9200/_plugin/head/中自行查詢
 26         client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("192.168.1.103", 9300));
 27     }
 28     
 29     public void close()
 30     {
 31         client.close();
 32     }
 33     
 34     /*
 35      * create index
 36      **/
 37     public void createIndex() {
 38         for (int i = 0; i < 1000; i++) {
 39             User user = new User();
 40             user.setId(new Long(i));
 41             user.setName("xxx0624 " + i);
 42             user.setAge(i % 100);
 43             System.out.println("ok:"+i);
 44             client.prepareIndex("users", "user").setSource(generateJson(user))
 45                     .execute().actionGet();
 46         }
 47     }
 48  
 49     /*
 50      * 轉換成json對象
 51      *
 52      * @param user
 53      * @return json(String)
 54      **/
 55     private String generateJson(User user) {
 56         String json = "";
 57         try {
 58             XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
 59                     .startObject();
 60             contentBuilder.field("id", user.getId() + "");
 61             contentBuilder.field("name", user.getName());
 62             contentBuilder.field("age", user.getAge() + "");
 63             json = contentBuilder.endObject().string();
 64         } catch (IOException e) {
 65             e.printStackTrace();
 66         }
 67         return json;
 68     }
 69     
 70     public void search() {
 71         QueryBuilder qb = QueryBuilders
 72                 .boolQuery()
 73                 .must(QueryBuilders.termQuery("age", "0"))
 74                 .should(QueryBuilders.termQuery("id", "0"))
 75                 //.mustNot(QueryBuilders.termQuery("content", "test2"))
 76                 //.should(QueryBuilders.termQuery("content", "test3"))
 77                 ;
 78         
 79         SearchResponse response = client.prepareSearch("users")
 80                 .setTypes("user")
 81                 .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
 82                 .setQuery(qb) // Query
 83                 //.setFilter(FilterBuilders.rangeFilter("age").from(0).to(100)) // Filter
 84                 .setFrom(0).setSize(100).setExplain(true)
 85                 .execute().actionGet();
 86         SearchHits hits = response.getHits();
 87         System.out.println(hits.getTotalHits());
 88         for (int i = 0; i < hits.getHits().length; i++) {
 89             System.out.println(hits.getHits()[i].getSourceAsString());
 90         }
 91     }    
 92  
 93     public static void main(String[] args) {
 94         
 95         First_ES_Test client = new First_ES_Test();
 96         client.init();
 97         client.createIndex();
 98         client.search();
 99         client.close();
100 
101     }
102     
103     public void print(String output)
104     {
105         System.out.print(output);
106     }
107     public void println(String output)
108     {
109         System.out.println(output);
110     }
111 
112 }
View Code

 

待續...

 


免責聲明!

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



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