目錄
測試環(huán)境準(zhǔn)備
在指定索引下搜索全部(可以指定字段)
通過ids進(jìn)行搜索
對搜索結(jié)果進(jìn)行分頁
match分詞搜索
不分詞模糊搜索:wildcardQuery與matchPhraseQuery
term 搜索(精確匹配)
multi_match搜索
bool搜索 多條件匹配
filter過濾搜索
sort排序搜索
后續(xù)待補充:queryStringQuery,minimumShouldMatch,對檢索結(jié)果中的關(guān)鍵詞進(jìn)行高亮
測試環(huán)境準(zhǔn)備
測試環(huán)境:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>2.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.3.0</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.3.0</version>
</dependency>
2配置 application.yml
spring:
application:
name: service-search
eslearn:
elasticsearch:
hostlist: 127.0.0.1:9200 #多個結(jié)點中間用逗號分隔
?3主類代碼
@SpringBootApplication
public class SearchApplication {
public static void main(String[] args) {
SpringApplication.run(SearchApplication.class,args);
}
}
配置類:
package com.learn.es.cofig;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author LJM
* @create 2022/12/10
*/
@Configuration
public class ElasticSearchConfig {
@Value("${eslearn.elasticsearch.hostlist}")
private String hostList;
@Bean(destroyMethod = "close") //表示連接使用完成后需要關(guān)閉
public RestHighLevelClient restHighLevelClient(){
String[] split = hostList.split(",");
//這種寫法是考慮到可能會配置多個es節(jié)點
HttpHost[] httpHosts = new HttpHost[split.length];
for (int i = 0; i < split.length; i++) {
String item = split[i];
httpHosts[i] = new HttpHost(item.split(":")[0],Integer.parseInt(item.split(":")[1]),"http");
}
return new RestHighLevelClient(RestClient.builder(httpHosts));
}
}
測試項目結(jié)構(gòu):
?在kibana中把數(shù)據(jù)插入es中:
delete book //先刪除索引
PUT /book //往索引中插入數(shù)據(jù)進(jìn)行測試,后面在api實現(xiàn)搜索的小節(jié),可以使用從數(shù)據(jù)庫中讀取數(shù)據(jù) 然后把數(shù)據(jù)插入es庫指定的索引
PUT /book/_doc/1
{
"name": "Bootstrap開發(fā)",
"description": "Bootstrap是由Twitter推出的一個前臺頁面開發(fā)css框架,是一個非常流行的開發(fā)框架,此框架集成了多種頁面效果。此開發(fā)框架包含了大量的CSS、JS程序代碼,可以幫助開發(fā)者(尤其是不擅長css頁面開發(fā)的程序人員)輕松的實現(xiàn)一個css,不受瀏覽器限制的精美界面css效果。",
"studymodel": "201002",
"price":38.6,
"timestamp":"2019-08-25 19:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "bootstrap", "dev"]
}
PUT /book/_doc/2
{
"name": "java編程思想",
"description": "java語言是世界第一編程語言,在軟件開發(fā)領(lǐng)域使用人數(shù)最多。",
"studymodel": "201001",
"price":68.6,
"timestamp":"2019-08-25 19:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "java", "dev"]
}
PUT /book/_doc/3
{
"name": "spring開發(fā)基礎(chǔ)",
"description": "spring 在java領(lǐng)域非常流行,java程序員都在用。",
"studymodel": "201001",
"price":88.6,
"timestamp":"2019-08-24 19:11:35",
"pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags": [ "spring", "java"]
}
測試類代碼結(jié)構(gòu):?
/**
* @author LJM
* @create 2022/12/13
* 測試使用java代碼實現(xiàn)es的各種搜索
*/
@SpringBootTest(classes = SearchApplication.class)
@RunWith(SpringRunner.class)
public class TestSearch {
@Autowired
RestHighLevelClient client;
// 后面的測試方法會全部寫在這個類中 .....
}
在指定索引下搜索全部(可以指定字段)
在kibana中 GET /book/_search 先獲取一下本地es庫中的book索引下有多少數(shù)據(jù)。
/**
* 搜索全部
* GET book/_search
* {
* "query": {
* "match_all": {}
* }
* }
* @throws IOException
*/
@Test
public void testSearchAll() throws IOException {
//1構(gòu)建搜索請求 實際生產(chǎn)環(huán)境中這個索引名稱的獲取:①把這個索引名稱寫在枚舉類中,然后從枚舉類中獲取②從配置文件中獲取
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//獲取某些字段
searchSourceBuilder.fetchSource(new String[]{"name"}, new String[]{});
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("score:" + score);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
通過ids進(jìn)行搜索
/**
* 通過ids進(jìn)行搜索 有的就查詢出來,沒有的也不會報錯
* GET /book/_search
* {
* "query": {
* "ids" : {
* "values" : ["1", "2", "6"]
* }
* }
* }
* @throws IOException
*/
@Test
public void testSearchIds() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.idsQuery().addIds("1","2","6"));
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
對搜索結(jié)果進(jìn)行分頁
/**
* 對搜索結(jié)果進(jìn)行分頁
* GET book/_search
* {
* "query": {
* "match_all": {}
* },
* "from": 0,
* "size": 2
* }
*/
@Test
public void testSearchPage() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//搜索第幾頁的數(shù)據(jù)
int page=1;
//每頁展示幾個數(shù)據(jù)
//int size=2; //因為本地es一共就插入了三條數(shù)據(jù)進(jìn)行測試,所以可以把大小分別設(shè)置為2和3看一下輸出效果
int size=3;
//下標(biāo)計算
int from = (page-1) / size;
searchSourceBuilder.from(from);
searchSourceBuilder.size(size);
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
match分詞搜索
/**
* match搜索 這個是會進(jìn)行分詞搜索的
* GET /book/_search
* {
* "query": {
* "match": {
* "description": "java程序員"
* }
* }
* }
* @throws IOException
*/
@Test
public void testSearchMatch() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("description", "java程序員"));
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
不分詞模糊搜索:wildcardQuery與matchPhraseQuery
/**
* 不分詞模糊搜索 like '%檢索詞%'
* @throws IOException
*/
@Test
public void testSearchLike() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//使用matchPhraseQuery 需要對檢索的關(guān)鍵詞的前后加 * 否則不是完全的模糊匹配 可以對檢索的結(jié)果中的檢索關(guān)鍵詞進(jìn)行高亮
searchSourceBuilder.query(QueryBuilders.matchPhraseQuery("description", "*"+"程序員"+"*"));
//還可以使用wildcardQuery 但是這種就會導(dǎo)致檢索的結(jié)果不能高亮(這個不太確定,但是我自己試的時候,這樣確實是不能對檢索結(jié)果中的檢索詞進(jìn)行高亮)
//需要在檢索的字段名后拼接 ".keyword" 并且也需要對檢索詞前后添加 *
// searchSourceBuilder.query(QueryBuilders.wildcardQuery("description"+".keyword","*"+"程序員"+"*"));
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
term 搜索(精確匹配)
/**
* term 搜索 如果字段為keyword那么【存儲】和【搜索】都不分詞。 搜索的時候相當(dāng)于在使用 = 符號進(jìn)行搜索
* GET / book / _search
* {
* "query":{
* "term":{
* "description":"java程序員"
* }
* }
* }
* @throws IOException
*/
@Test
public void testSearchTerm() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//如果字段的映射是text但是也想要精確匹配,可以這樣操作:QueryBuilders.termQuery("description" + ".keyword","java程序員")
searchSourceBuilder.query(QueryBuilders.termQuery("description", "java語言"));
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
multi_match搜索
/**
* multi_match搜索
* GET /book/_search
* {
* "query": {
* "multi_match": {
* "query": "java程序員",
* "fields": ["name", "description"]
* }
* }
* }
* @throws IOException
*/
@Test
public void testSearchMultiMatch() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//第二個參數(shù)才是 字段 第一個參數(shù)是匹配的內(nèi)容
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("java程序員","name","description"));
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
bool搜索 多條件匹配
/**
* bool搜索 多條件匹配 and or !=
* GET / book / _search
* {
* "query":{
* "bool":{
* "must": [
* {
* "multi_match":{
* "query":"java程序員",
* "fields": ["name", "description"]
* }
* }
* ],
* "should": [
* {
* "match":{
* "studymodel":"201001"
* }
* }
* ]
* }
* }
* }
* @throws IOException
*/
@Test
public void testSearchBool() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//構(gòu)建multiMatch請求 第一個參數(shù)是檢索內(nèi)容 第二個參數(shù)是檢索的字段
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序員", "name", "description");
//構(gòu)建match請求
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "測試沒有的字段");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.should(matchQueryBuilder);
// boolQueryBuilder.must(matchQueryBuilder); //把should改成must就相當(dāng)于用 and進(jìn)行了再一次的過濾 就會查詢不到數(shù)據(jù)
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
}
filter過濾搜索
過濾搜索和范圍搜索的區(qū)別:
filter,僅僅只是按照搜索條件過濾出需要的數(shù)據(jù)而已,不計算任何相關(guān)度分?jǐn)?shù),對相關(guān)度沒有任何影響。文章來源:http://www.zghlxwxcb.cn/news/detail-801775.html
query,會去計算每個document相對于搜索條件的相關(guān)度,并按照相關(guān)度進(jìn)行排序。文章來源地址http://www.zghlxwxcb.cn/news/detail-801775.html
/**
* filter過濾搜索
* GET /book/_search
* {
* "query": {
* "bool": {
* "must": [
* {
* "multi_match": {
* "query": "java程序員",
* "fields": ["name","description"]
* }
* }
* ],
* "should": [
* {
* "match": {
* "studymodel": "201001"
* }
* }
* ],
* "filter": {
* "range": {
* "price": {
* "gte": 50,
* "lte": 90
* }
* }
*
* }
* }
* }
* }
* @throws IOException
*/
@Test
public void testSearchFilter() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//構(gòu)建multiMatch請求
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序員", "name", "description");
//構(gòu)建match請求
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.should(matchQueryBuilder);
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(50).lte(90));
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
sort排序搜索
/**
* sort排序搜索
* GET /book/_search
* {
* "query": {
* "bool": {
* "must": [
* {
* "multi_match": {
* "query": "java程序員",
* "fields": ["name","description"]
* }
* }
* ],
* "should": [
* {
* "match": {
* "studymodel": "201001"
* }
* }
* ],
* "filter": {
* "range": {
* "price": {
* "gte": 50,
* "lte": 90
* }
* }
*
* }
* }
* },
* "sort": [
* {
* "price": {
* "order": "asc"
* }
* }
* ]
* }
* @throws IOException
*/
@Test
public void testSearchSort() throws IOException {
//1構(gòu)建搜索請求
SearchRequest searchRequest = new SearchRequest("book");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//構(gòu)建multiMatch請求
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序員", "name", "description");
//構(gòu)建match請求
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");
BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.should(matchQueryBuilder);
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(50).lte(90));
searchSourceBuilder.query(boolQueryBuilder);
//按照價格升序
searchSourceBuilder.sort("price", SortOrder.ASC);
searchRequest.source(searchSourceBuilder);
//2執(zhí)行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//3獲取結(jié)果
SearchHits hits = searchResponse.getHits();
//數(shù)據(jù)數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
System.out.println("--------------------------");
for (SearchHit hit : searchHits) {
String id = hit.getId();
float score = hit.getScore();
//這個source里面就是我們存儲的數(shù)據(jù)
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
String name = (String) sourceAsMap.get("name");
String description = (String) sourceAsMap.get("description");
Double price = (Double) sourceAsMap.get("price");
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("description:" + description);
System.out.println("price:" + price);
System.out.println("==========================");
}
}
后續(xù)待補充:queryStringQuery,minimumShouldMatch,對檢索結(jié)果中的關(guān)鍵詞進(jìn)行高亮
到了這里,關(guān)于通過java代碼實現(xiàn)ES中的常用搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!