ElasticSearch 批量条件查询

 

编写不易,转载请注明(http://shihlei.iteye.com/blog/2408238)!

一 概述

ElasticSearch 批量条件查询方法Demo。

使用《ElasticSearch2.4.0基于Java API或Java Rest API进行CRUD 》的索引库结构开发Demo.

 

客户端版本:版本较低,见谅

       <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>2.4.0</version>
        </dependency>

 

二 索引库准备

1)创建索引库

curl -XPUT 'http://localhost:9200/indexdb' -d '{
    "settings" : {
        "index" : {
            "number_of_shards" : 1,
            "number_of_replicas" : 1
        }
    }
}'

 

2)创建Mapping

curl -XPUT 'http://localhost:9200/indexdb/_mapping/docs' -d '{
   "properties": {
       "id": {
            "type": "long",
            "index": "no"
       },
       "title": {
            "type": "string",
            "index": "not_analyzed",
            "index_options": "docs"
       },
       "author": {
            "type": "string",
            "index": "not_analyzed",
            "index_options": "docs"
       },
       "tags": {
            "type": "string",
            "boost" : 3.0,
            "index_options": "docs"
       },
       "publishTime": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
       }
   }
}'

 

3)造测试数据

curl -XPOST 'http://localhost:9200/_bulk' -d '
{ "index" : { "_index" : "indexdb", "_type" : "docs", "_id" : "1" } }
{"author":"author_1","id":1,"publishTime":"2018-01-21 00:00:00","tags":["male","car"],"title":"title_1"}
{ "index" : { "_index" : "indexdb", "_type" : "docs", "_id" : "2" } }
{"author":"author_2","id":2,"publishTime":"2018-01-21 00:00:00","tags":["male","game"],"title":"title_2"}
{ "index" : { "_index" : "indexdb", "_type" : "docs", "_id" : "3" } }
{"author":"author_3","id":3,"publishTime":"2018-01-21 00:00:00","tags":["female","car"],"title":"title_3"}
{ "index" : { "_index" : "indexdb", "_type" : "docs", "_id" : "4" } }
{"author":"author_4","id":4,"publishTime":"2018-01-21 00:00:00","tags":["female","game"],"title":"title_4"}
'

 

4)查看造数据情况

curl -XGET 'http://localhost:9200/indexdb/docs/_search?pretty=true'

 结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "indexdb",
      "_type" : "docs",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "author" : "author_1",
        "id" : 1,
        "publishTime" : "2018-01-21 00:00:00",
        "tags" : [ "male", "car" ],
        "title" : "title_1"
      }
    }, {
      "_index" : "indexdb",
      "_type" : "docs",
      "_id" : "2",
      "_score" : 1.0,
      "_source" : {
        "author" : "author_2",
        "id" : 2,
        "publishTime" : "2018-01-21 00:00:00",
        "tags" : [ "male", "game" ],
        "title" : "title_2"
      }
    }, {
      "_index" : "indexdb",
      "_type" : "docs",
      "_id" : "3",
      "_score" : 1.0,
      "_source" : {
        "author" : "author_3",
        "id" : 3,
        "publishTime" : "2018-01-21 00:00:00",
        "tags" : [ "female", "car" ],
        "title" : "title_3"
      }
    }, {
      "_index" : "indexdb",
      "_type" : "docs",
      "_id" : "4",
      "_score" : 1.0,
      "_source" : {
        "author" : "author_4",
        "id" : 4,
        "publishTime" : "2018-01-21 00:00:00",
        "tags" : [ "female", "game" ],
        "title" : "title_4"
      }
    } ]
  }
}

 

三 Http 查询

1)使用_msearch进行批量条件查询:

分别查询:tags为car 和tags为male的两个查询

curl -XGET 'http://localhost:9200/indexdb/docs/_msearch?pretty=true' -d '
{"index" : "indexdb"}
{  "query" : {    "bool" : {      "filter" : {        "terms" : {          "tags" : [ "car" ]        }      }    }  },  "fields" : [ "id", "title", "author", "publishTime"]}
{"index" : "indexdb"}
{  "query" : {    "bool" : {      "filter" : {        "terms" : {          "tags" : [ "male" ]        }      }    }  },  "fields" : [ "id", "title", "author", "publishTime"]}
'

 

2)结果

{
  "responses" : [ {
    "took" : 1,
    "timed_out" : false,
    "_shards" : {
      "total" : 1,
      "successful" : 1,
      "failed" : 0
    },
    "hits" : {
      "total" : 2,
      "max_score" : 0.0,
      "hits" : [ {
        "_index" : "indexdb",
        "_type" : "docs",
        "_id" : "1",
        "_score" : 0.0,
        "fields" : {
          "id" : [ 1 ],
          "author" : [ "author_1" ],
          "title" : [ "title_1" ],
          "publishTime" : [ "2018-01-21 00:00:00" ]
        }
      }, {
        "_index" : "indexdb",
        "_type" : "docs",
        "_id" : "3",
        "_score" : 0.0,
        "fields" : {
          "id" : [ 3 ],
          "author" : [ "author_3" ],
          "title" : [ "title_3" ],
          "publishTime" : [ "2018-01-21 00:00:00" ]
        }
      } ]
    }
  }, {
    "took" : 20,
    "timed_out" : false,
    "_shards" : {
      "total" : 1,
      "successful" : 1,
      "failed" : 0
    },
    "hits" : {
      "total" : 2,
      "max_score" : 0.0,
      "hits" : [ {
        "_index" : "indexdb",
        "_type" : "docs",
        "_id" : "1",
        "_score" : 0.0,
        "fields" : {
          "id" : [ 1 ],
          "author" : [ "author_1" ],
          "title" : [ "title_1" ],
          "publishTime" : [ "2018-01-21 00:00:00" ]
        }
      }, {
        "_index" : "indexdb",
        "_type" : "docs",
        "_id" : "2",
        "_score" : 0.0,
        "fields" : {
          "id" : [ 2 ],
          "author" : [ "author_2" ],
          "title" : [ "title_2" ],
          "publishTime" : [ "2018-01-21 00:00:00" ]
        }
      } ]
    }
  } ]
}

 

四 Java TCP Demo 

1)程序

package x.search.es.simple.demo;

import java.net.InetAddress;
import java.util.Objects;

import org.elasticsearch.action.search.MultiSearchRequestBuilder;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;

public class DocumentMSearchDemo {
    private static final String ES_HOST = "localhost";
    private static final int ES_TCP_PORT = 9300;

    private TransportClient client;


    public static void main(String[] args) throws Exception {
        DocumentMSearchDemo mSearchDemo = new DocumentMSearchDemo();
        mSearchDemo.init();
        mSearchDemo.msearch();
        mSearchDemo.close();
    }

    public void init() throws Exception {
        //特别注意:如果cluster 起了名字,需要在连接时指定名字,否则验证客户端连接的不是默认集群elasticsearch,会忽略,则无法找到节点
        Settings settings = Settings.settingsBuilder()
                .put("cluster.name", "es_cluster").build();
        client = TransportClient.builder().settings(settings).build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ES_HOST), ES_TCP_PORT));
    }

    public void close() {
        if (!Objects.isNull(client)) {
            client.close();
        }
    }

    public void msearch() {
        //构建批量查询
        MultiSearchRequestBuilder multiSearchRequestBuilder = client.prepareMultiSearch();

        //创建查询条件
        //查询tags:car
        SearchRequestBuilder carSearch = client.prepareSearch("indexdb");
        carSearch.setQuery(QueryBuilders.termQuery("tags", "car"));
        multiSearchRequestBuilder.add(carSearch);

        //查询tags:male
        SearchRequestBuilder maleSearch = client.prepareSearch("indexdb");
        maleSearch.setQuery(QueryBuilders.termQuery("tags", "male"));
        multiSearchRequestBuilder.add(maleSearch);

        //请求
        MultiSearchResponse response = multiSearchRequestBuilder.get();
        MultiSearchResponse.Item[] items = response.getResponses();

        for (MultiSearchResponse.Item item : items) {
            SearchHits hits = item.getResponse().getHits();
            //无查询结果
            if (hits.totalHits() > 0) {
                SearchHit[] hitList = hits.getHits();
                for (SearchHit searchHit : hitList) {
                    System.out.println(searchHit.getSourceAsString());
                }
            }
            System.out.println("-------------------------------------");
        }
    }
}

 

2)结果

{"author":"author_1","id":1,"publishTime":"2018-01-21 00:00:00","tags":["male","car"],"title":"title_1"}
{"author":"author_3","id":3,"publishTime":"2018-01-21 00:00:00","tags":["female","car"],"title":"title_3"}
-------------------------------------
{"author":"author_1","id":1,"publishTime":"2018-01-21 00:00:00","tags":["male","car"],"title":"title_1"}
{"author":"author_2","id":2,"publishTime":"2018-01-21 00:00:00","tags":["male","game"],"title":"title_2"}

 

 

猜你喜欢

转载自shihlei.iteye.com/blog/2408238