ElasticSearch Java api 详解_V1.0

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

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");
//+表示必须有的 -表示一定没有的

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 }

待续...

时间: 2024-10-10 03:04:54

ElasticSearch Java api 详解_V1.0的相关文章

elasticsearch中api详解

一.cluster API详解 1.cluster health(获取集群的状态) 集群状态: green:绿色表示所有的碎片都被分配 yellow:黄色表示主碎片被分配,但副本不是     red:表示特定的碎片没有在集群中分配 请求参数 level: cluster,indices,shards wait_for_status: green,yellow,red [[email protected] ~]# curl -XGET 'http://10.2.11.225:9200/_clust

spark2.x由浅入深深到底系列六之RDD java api详解三

学习任何spark知识点之前请先正确理解spark,可以参考:正确理解spark 本文详细介绍了spark key-value类型的rdd java api 一.key-value类型的RDD的创建方式 1.sparkContext.parallelizePairs JavaPairRDD<String, Integer> javaPairRDD =         sc.parallelizePairs(Arrays.asList(new Tuple2("test", 3

spark2.x由浅入深深到底系列六之RDD java api详解二

package com.twq.javaapi.java7; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.Function2; import org.apache.spark.api.java.funct

spark2.x由浅入深深到底系列六之RDD java api详解四

学习spark任何的知识点之前,先对spark要有一个正确的理解,可以参考:正确理解spark 本文对join相关的api做了一个解释 SparkConf conf = new SparkConf().setAppName("appName").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaPairRDD<Integer, Integer> javaPa

spark2.x由浅入深深到底系列六之RDD java api详解一

以下对RDD的三种创建方式.单类型RDD基本的transformation api.采样Api以及pipe操作进行了java api方面的阐述 一.RDD的三种创建方式 从稳定的文件存储系统中创建RDD,比如local fileSystem或者hdfs等,如下: //从hdfs文件中创建 JavaRDD<String> textFileRDD = sc.textFile("hdfs://master:9999/users/hadoop-twq/word.txt"); //从

HDFS常用的Java Api详解

转自:http://blog.csdn.net/michaelwubo/article/details/50879832 一.使用Hadoop URL读取数据 package hadoop; import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.io.IOUtils; public class

Java 8 Stream API详解

Java 8 Stream API详解 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream.Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷.高效的聚合操作或大批量数据操

Java 8 Streams API 详解

流式编程作为Java 8的亮点之一,是继Java 5之后对集合的再一次升级,可以说Java 8几大特性中,Streams API 是作为Java 函数式的主角来设计的,夸张的说,有了Streams API之后,万物皆可一行代码. 什么是Stream Stream被翻译为流,它的工作过程像将一瓶水导入有很多过滤阀的管道一样,水每经过一个过滤阀,便被操作一次,比如过滤,转换等,最后管道的另外一头有一个容器负责接收剩下的水. 示意图如下: 首先通过source产生流,然后依次通过一些中间操作,比如过滤

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情.简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口:困难是因为我们不了解算法细节,很难去根据业务的场景进行算法配置和调优. 本文将深入算法API去解释Mahout推荐算法底层的一些事. 1. Mahout推荐算法介绍 Mahoutt推荐算法,从数据处理能力上,可以划分为2类: 单机内存算法实现 基于Hadoop的分步式算法实现 1). 单机内存算法实现 单机内存算法实现:就是在单机下运行的算法