前两篇 , 已经将准备工作完成。下面进入正式的java代码开发。
1) pom.xml引入jar,2020年3月16日,目前的es版本是7.6.1
<code>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-elasticsearch/<artifactid>
/<dependency>
<dependency>
<groupid>org.elasticsearch/<groupid>
<artifactid>elasticsearch/<artifactid>
<version>7.6.1/<version>
/<dependency>
<dependency>
<groupid>org.elasticsearch.client/<groupid>
<artifactid>transport/<artifactid>
<version>7.6.1/<version>
/<dependency>
<dependency>
<groupid>org.elasticsearch.plugin/<groupid>
<artifactid>transport-netty4-client/<artifactid>
<version>7.6.1/<version>
/<dependency>/<code>
2) application.yml 配置es连接
<code>spring:
data:
elasticsearch:
cluster-name: docker-cluster
cluster-nodes: 127.0.0.1:9300/<code>
3)查看一下es中有哪些index(相当于mysql的database)
访问:http://127.0.0.1:9200/_cat/indices?v
因为我装了kibana,所以有kibana的测试数据集合
4)浏览一下 kibana_sample_data_ecommerce里面的数据
访问:http://127.0.0.1:9200/kibana_sample_data_ecommerce/_doc/_search?q=*
5)编写测试类
<code>package cn.test;
import cn.mytestprojec.Application;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.DisMaxQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {DataCaptureApplication.class})// 指定启动类
@WebAppConfiguration
public class ElasticSearchTest {
//解决netty冲突
static {
System.setProperty("es.set.netty.runtime.available.processors", "false");
}
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void searchTest() throws Exception {
//这句相当于sql where customer_gender = "FEMALE"
QueryBuilder operidQuery = QueryBuilders.termQuery("customer_gender", "FEMALE");
/** 全文查询开始 任意字段模糊查询Women Man **/
// QueryBuilders.matchAllQuery() 匹配全部,相当于where 1=1
//disMax查询:对子查询的结果做union, score沿用子查询score的最大值,广泛用于muti-field查询
DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery().add(QueryBuilders.matchAllQuery());
String tstr1 = "Women";
QueryBuilder subQuery = QueryBuilders.queryStringQuery("*" + tstr1 + "*").defaultField("*");
disMaxQuery = disMaxQuery.add(subQuery);
String tstr2 = "Man";
subQuery = QueryBuilders.queryStringQuery("*" + tstr2 + "*").defaultField("*");
disMaxQuery = disMaxQuery.add(subQuery);
disMaxQuery.boost(1.3f).tieBreaker(0.7f);
/** 全文查询结束 **/
//组合查询:must: AND, mustNot: NOT, should: OR
QueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(operidQuery).should(disMaxQuery);
//withIndices 指定index,相当于mysql中指定数据库;withTypes:指定type,相当于mysql中指定表.es7.0以后版本,type默认为:_doc
SearchQuery searchQuery = new NativeSearchQueryBuilder().withIndices("kibana_sample_data_ecommerce").withTypes("_doc")
.withQuery(boolQuery)
.build();
elasticsearchTemplate.query(searchQuery, response -> {
//将es结果封装成JSONObject
JSONObject jobj = JSONObject.parseObject(response.toString());
log.info(jobj.getJSONObject("hits").toJSONString());
return JSONObject.parseObject(response.toString());
});
}
}
/<code>
6)运行测试:
json格式化后的结果:
7)总结:
springdata访问es有两个主要的类:ElasticSearchRepository和ElasticSearchTemplate,这里用的ElasticSearchTemplate和接近原生态的查询方法。原生态的查询更强大,而且不需要写实体类(不受实体类限制)。
常出的错误,都在代码和配置文件里面避免了。
閱讀更多 大盅碼 的文章
關鍵字: ElasticSearch 两篇 数据库