Elasticsearch in java范例:索引文本数据、搜索文本数据入门

本文地址:http://blog.csdn.net/gumpeng/article/details/50414028

本文主要是基于java语言,描述如果建议一个Elasticsearch索引数据的简单过程。

1.建立schema

新建一个名为test_mapping.json的文件,存放索引的schema,具体内容如下:

{
  "mappings": {
    "stock": {
      "_id": {
        "path": "id"
      },
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string",
          "index": "not_analyzed"
        },
        "companyDesc": {
          "type": "string",
          "analyzer": "standard"
        }
      }
    }
  }
}

然后,将schem注入到ES引擎中,具体代码如下:

public static String fileAsString(String file) throws IOException {
    if (new File(file).exists()) {
        CharSource mapping = Files.asCharSource(new File(file),
                    Charset.forName("utf-8"));
        String str = mapping.read();
        return str;
    } else {
        InputStream input = EsHelper.class.getClassLoader()
                    .getResourceAsStream(file);
        if (input != null) {
            String string = CharStreams.toString(new InputStreamReader(
                        input, "UTF-8"));
            return string;
        }

        return null;
    }
}

Client client = new TransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(esHosts, 9300));
String index = "stock_simplest_demo";
CreateIndexRequest request = new CreateIndexRequest(index);
String source = fileAsString("test_mapping.json");
request.source(source);
client.admin().indices().create(request).actionGet();

2. 索引数据

String esHosts = "";
String clusterName = "";
String index = "stock_simplest_demo";
String type = "stock";
GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Gson gson = gsonBuilder.create();
Settings settings = ImmutableSettings.settingsBuilder()
                .put("client.transport.sniff", true)
                .put("cluster.name", clusterName).put("node.client", true)
                .build();
Client client = new TransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(esHosts, 9300));
BulkRequestBuilder bulkRequest =  client.prepareBulk();
List stocks = new ArrayList();
stocks.add(new Stock("601390", "中国中铁","中国中铁股份有限公司是集基建建设、勘察设计与咨询服务、工程设备和零部件制造、房地产开发、铁路和公路投资及运营、矿产资源开发、物资贸易等业务于一体的多功能、特大型企业集团,也是中国和亚洲最大的多功能综合型建设集团。" ));
stocks.add(new Stock("601186", "中国铁建", "中国铁建股份有限公司(中文简称中国铁建,英文简称 CRCC),由中国铁道建筑总公司独家发起设立,于2007 年11月5 日在北京成立,为国务院国有资产监督管理委员会管理的特大型建筑企业。"));
stocks.add(new Stock("601766", "中国中车", "中国中车股份有限公司(中文简称“中国中车”,英文简称缩写“CRRC”)是经国务院同意,国务院国资委批准,由中国北车股份有限公司、中国南车股份有限公司按照对等原则合并组建的A+H股上市公司。"));
stocks.add(new Stock("600115", "东方航空", "中国东方航空股份有限公司(China Eastern Airlines)是一家总部位于中国上海的国有控股航空公司,在原中国东方航空集团公司的基础上,兼并中国西北航空公司,联合中国云南航空公司重组而成。"));
stocks.add(new Stock("000527", "美的电器", "创业于1968年的美的集团,是一家以家电业为主,涉足房产、物流等领域的大型综合性现代化企业集团,旗下拥有两家上市公司、四大产业集团,是中国最具规模的白色家电生产基地和出口基地。"));
for (Stock stock : stocks) {
    JsonObject jo = (JsonObject) gson.toJsonTree(stock);
    String jsonSource = gson.toJson(jo);
    bulkRequest.add(client.prepareIndex(index, type, stock.getId()).setSource(jsonSource));
        }
BulkResponse bulkResponse = bulkRequest.execute().actionGet();

其中第一行的esHosts和第二行的clusterName需要根据自己的ES集群配置自行设定(下同)。

3.搜索数据 

数据建完索引后,就可以使用搜索功能啦。

String input = "铁建"
String clusterName = "";
String esHosts = "";
Settings settings = ImmutableSettings.settingsBuilder().put("client.transport.sniff", true).put("cluster.name", clusterName).put("node.client", true).build();
Client client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(esHosts, 9300));

String[] fields = {"name", "companyDesc"};
BoolQueryBuilder boolMatchQueryBuilder = QueryBuilders.boolQuery();
MultiMatchQueryBuilder mmb = QueryBuilders.multiMatchQuery(input, fields);
//Indicates that this percent of the total number of optional clauses are necessary. 
//The number computed from the percentage is rounded down and used as the minimum.
mmb.minimumShouldMatch("70%");
boolMatchQueryBuilder.must(mmb);

MultiMatchQueryBuilder mmbph = QueryBuilders.multiMatchQuery(input, fields);
mmbph.type(MultiMatchQueryBuilder.Type.PHRASE);
boolMatchQueryBuilder.should(mmbph);

QueryBuilder query = QueryBuilders.filteredQuery(mmb, null);
SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type).setQuery(query);
SearchResponse response = srb.execute().actionGet();
System.out.println(response);

上段代码的输出效果如下所示:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.581694,
    "hits" : [ {
      "_index" : "stock_simplest_demo",
      "_type" : "stock",
      "_id" : "601186",
      "_score" : 0.581694,
      "_source":{"id":"601186","name":"中国铁建","companyDesc":"中国铁建股份有限公司(中文简称中国铁建,英文简称 CRCC),由中国铁道建筑总公司独家发起设立,于2007 年11月5 日在北京成立,为国务院国有资产监督管理委员会管理的特大型建筑企业。"}
    }, {
      "_index" : "stock_simplest_demo",
      "_type" : "stock",
      "_id" : "601390",
      "_score" : 0.08961828,
      "_source":{"id":"601390","name":"中国中铁","companyDesc":"中国中铁股份有限公司是集基建建设、勘察设计与咨询服务、工程设备和零部件制造、房地产开发、铁路和公路投资及运营、矿产资源开发、物资贸易等业务于一体的多功能、特大型企业集团,也是中国和亚洲最大的多功能综合型建设集团。"}
    }, {
      "_index" : "stock_simplest_demo",
      "_type" : "stock",
      "_id" : "601766",
      "_score" : 0.022839066,
      "_source":{"id":"601766","name":"中国中车","companyDesc":"中国中车股份有限公司(中文简称“中国中车”,英文简称缩写“CRRC”)是经国务院同意,国务院国资委批准,由中国北车股份有限公司、中国南车股份有限公司按照对等原则合并组建的A+H股上市公司。"}
    } ]
  }
}

你可能感兴趣的:(Elasticsearch)