Elasticsearch+springboot 全文检索(搜索)

前两篇 , 已经将准备工作完成。下面进入正式的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的测试数据集合


Elasticsearch+springboot 全文检索(搜索)

4)浏览一下 kibana_sample_data_ecommerce里面的数据

访问:http://127.0.0.1:9200/kibana_sample_data_ecommerce/_doc/_search?q=*


Elasticsearch+springboot 全文检索(搜索)

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)运行测试:


Elasticsearch+springboot 全文检索(搜索)


json格式化后的结果:


Elasticsearch+springboot 全文检索(搜索)


Elasticsearch+springboot 全文检索(搜索)

7)总结:

springdata访问es有两个主要的类:ElasticSearchRepository和ElasticSearchTemplate,这里用的ElasticSearchTemplate和接近原生态的查询方法。原生态的查询更强大,而且不需要写实体类(不受实体类限制)。

常出的错误,都在代码和配置文件里面避免了。


分享到:


相關文章: