当前位置:   article > 正文

Elasticsearch:运用 Java 对索引文档进行搜索_elastic java文档

elastic java文档

这是这个系列文章中的其中一篇文章:

在今天的文章中,我将详述如何对索引进行搜索。在进行下面的练习之前,我们先使用 Kibana 创建如下的一个叫做 twitter 的索引:

  1. PUT twitter
  2. {
  3. "mappings": {
  4. "properties": {
  5. "DOB": {
  6. "type": "date"
  7. },
  8. "address": {
  9. "type": "text",
  10. "fields": {
  11. "keyword": {
  12. "type": "keyword",
  13. "ignore_above": 256
  14. }
  15. }
  16. },
  17. "age": {
  18. "type": "long"
  19. },
  20. "city": {
  21. "type": "text",
  22. "fields": {
  23. "keyword": {
  24. "type": "keyword",
  25. "ignore_above": 256
  26. }
  27. }
  28. },
  29. "country": {
  30. "type": "text",
  31. "fields": {
  32. "keyword": {
  33. "type": "keyword",
  34. "ignore_above": 256
  35. }
  36. }
  37. },
  38. "location": {
  39. "type": "geo_point"
  40. },
  41. "message": {
  42. "type": "text",
  43. "fields": {
  44. "keyword": {
  45. "type": "keyword",
  46. "ignore_above": 256
  47. }
  48. }
  49. },
  50. "province": {
  51. "type": "text",
  52. "fields": {
  53. "keyword": {
  54. "type": "keyword",
  55. "ignore_above": 256
  56. }
  57. }
  58. },
  59. "uid": {
  60. "type": "long"
  61. },
  62. "user": {
  63. "type": "text",
  64. "fields": {
  65. "keyword": {
  66. "type": "keyword",
  67. "ignore_above": 256
  68. }
  69. }
  70. }
  71. }
  72. }
  73. }

在上面,我们创建了一个叫做 twitter 的索引。如果你对上面命令还不是很清楚的话,请参阅我之前的文章 “开始使用 Elasticsearch (2)”。我们接着使用如下的命令来导入文档:

  1. POST twitter/_bulk
  2. {"index":{"_id":1}}
  3. {"user":"双榆树-张三","DOB":"1992-08-03","message":"今儿天气不错啊,出去转转去","uid":1,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
  4. {"index":{"_id":2}}
  5. {"user":"东城区-老刘","DOB":"1990-07-14","message":"出发,下一站云南!","uid":2,"age":32,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
  6. {"index":{"_id":3}}
  7. {"user":"东城区-李四","DOB":"1997-09-23","message":"happy birthday!","uid":3,"age":25,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
  8. {"index":{"_id":4}}
  9. {"user":"朝阳区-老贾","DOB":"1980-06-30","message":"123,gogogo","uid":4,"age":42,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
  10. {"index":{"_id":5}}
  11. {"user":"朝阳区-老王","DOB":"1996-06-18","message":"Happy BirthDay My Friend!","uid":5,"age":26,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
  12. {"index":{"_id":6}}
  13. {"user":"虹桥-老吴","DOB":"2000-04-05","message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":22,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}

请注意上面的 DOB 代表的是 date of birth,也就是生日。我们可以使用如下的命令来进行查看文档的数量:

GET twitter/_count

上面会显示 6 个文档。

创建 Java 应用对文档进行搜索

为了方便大家对代码的理解,我把最终的代码置于 githubhttps://github.com/liu-xiao-guo/ElasticsearchJava-search。你可以使用如下的命令来下载代码:

git clone https://github.com/liu-xiao-guo/ElasticsearchJava-search

创建 Java 项目

我们可以参考之前的文章:

用自己喜欢的 IDE 来创建一个最为基本的 Java 项目。这里就不再累述。关于如何创建和 Elasticsearch 之间的连接,请参考上面的两篇文章。在接下来的描述中,我将详细讲解如何使用代码来进行搜索。

搜索文档

搜素一:搜索所有的文档

我们使用 Java 来搜索所有的文档:

  1. // Search 1: Search for all documents
  2. System.out.println("****************** Search 1");
  3. SearchRequest searchRequest = new SearchRequest();
  4. searchRequest.indices(INDEX_NAME);
  5. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  6. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  7. searchRequest.source(searchSourceBuilder);
  8. Map<String, Object> map=null;
  9. try {
  10. SearchResponse searchResponse = null;
  11. searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  12. if (searchResponse.getHits().getTotalHits().value > 0) {
  13. SearchHit[] searchHit = searchResponse.getHits().getHits();
  14. for (SearchHit hit : searchHit) {
  15. map = hit.getSourceAsMap();
  16. System.out.println("map:" + Arrays.toString(map.entrySet().toArray()));
  17. }
  18. }
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }

在上面,我们使用 QueryBuilders.matchAllQuery() 来查询所有的文档。上面的命令和 Kibana 中的如下的命令是一样的:

GET twitter/_search

运行上面的代码。它的运行结果是:

  1. ****************** Search 1
  2. map:[uid=1, country=中国, address=中国北京市海淀区, province=北京, city=北京, DOB=1992-08-03, location={lon=116.325747, lat=39.970718}, message=今儿天气不错啊,出去转转去, user=双榆树-张三, age=30]
  3. map:[uid=2, country=中国, address=中国北京市东城区台基厂三条3号, province=北京, city=北京, DOB=1990-07-14, location={lon=116.412754, lat=39.904313}, message=出发,下一站云南!, user=东城区-老刘, age=32]
  4. map:[uid=3, country=中国, address=中国北京市东城区, province=北京, city=北京, DOB=1997-09-23, location={lon=116.408986, lat=39.893801}, message=happy birthday!, user=东城区-李四, age=25]
  5. map:[uid=4, country=中国, address=中国北京市朝阳区建国门, province=北京, city=北京, DOB=1980-06-30, location={lon=116.367910, lat=39.718256}, message=123,gogogo, user=朝阳区-老贾, age=42]
  6. map:[uid=5, country=中国, address=中国北京市朝阳区国贸, province=北京, city=北京, DOB=1996-06-18, location={lon=116.467910, lat=39.918256}, message=Happy BirthDay My Friend!, user=朝阳区-老王, age=26]
  7. map:[uid=7, country=中国, address=中国上海市闵行区, province=上海, city=上海, DOB=2000-04-05, location={lon=121.383328, lat=31.175927}, message=好友来了都今天我生日,好友来了,什么 birthday happy 就成!, user=虹桥-老吴, age=22]

从上面的输出中,我们可以看出来:它搜索到所有的结果。

搜索二:搜索一定范围的数据

  1. // Search 2:
  2. System.out.println("****************** Search 2");
  3. SearchSourceBuilder builder = new SearchSourceBuilder()
  4. .postFilter(QueryBuilders.rangeQuery("age").from(25).to(30));
  5. SearchRequest searchRequest2 = new SearchRequest();
  6. searchRequest2.indices(INDEX_NAME);
  7. searchRequest2.searchType(SearchType.DFS_QUERY_THEN_FETCH);
  8. searchRequest2.source(builder);
  9. try {
  10. SearchResponse searchResponse = null;
  11. searchResponse = client.search(searchRequest2, RequestOptions.DEFAULT);
  12. if (searchResponse.getHits().getTotalHits().value > 0) {
  13. SearchHit[] searchHit = searchResponse.getHits().getHits();
  14. for (SearchHit hit : searchHit) {
  15. map = hit.getSourceAsMap();
  16. System.out.println("map:" + Arrays.toString(map.entrySet().toArray()));
  17. }
  18. }
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }

在上面,我们搜索年龄在 25 岁和 30 岁之间的所有文档。上面的命令类似于 Kibana 中的如下搜索:

  1. GET twitter/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "post_filter": {
  7. "range": {
  8. "age": {
  9. "gte": 25,
  10. "lte": 30
  11. }
  12. }
  13. }
  14. }

运行上面的应用,搜索二的输出结果为:

  1. ****************** Search 2
  2. map:[uid=1, country=中国, address=中国北京市海淀区, province=北京, city=北京, DOB=1992-08-03, location={lon=116.325747, lat=39.970718}, message=今儿天气不错啊,出去转转去, user=双榆树-张三, age=30]
  3. map:[uid=3, country=中国, address=中国北京市东城区, province=北京, city=北京, DOB=1997-09-23, location={lon=116.408986, lat=39.893801}, message=happy birthday!, user=东城区-李四, age=25]
  4. map:[uid=5, country=中国, address=中国北京市朝阳区国贸, province=北京, city=北京, DOB=1996-06-18, location={lon=116.467910, lat=39.918256}, message=Happy BirthDay My Friend!, user=朝阳区-老王, age=26]

从上面的结果中可以看出来 age 在 25 岁和 30 岁之间的文档有 3 个。

搜索三:在字段中进行全文搜索

  1. // Search 3:
  2. System.out.println("****************** Search 3");
  3. SearchSourceBuilder builder3 = new SearchSourceBuilder();
  4. builder3.from(0);
  5. builder3.size(2);
  6. builder3.timeout(new TimeValue(60, TimeUnit.SECONDS));
  7. builder3.query(QueryBuilders.matchQuery("user", "朝阳"));
  8. SearchRequest searchRequest3 = new SearchRequest();
  9. searchRequest3.indices(INDEX_NAME);
  10. searchRequest3.searchType(SearchType.DFS_QUERY_THEN_FETCH);
  11. searchRequest3.source(builder3);
  12. try {
  13. SearchResponse searchResponse = null;
  14. searchResponse = client.search(searchRequest3, RequestOptions.DEFAULT);
  15. if (searchResponse.getHits().getTotalHits().value > 0) {
  16. SearchHit[] searchHit = searchResponse.getHits().getHits();
  17. for (SearchHit hit : searchHit) {
  18. map = hit.getSourceAsMap();
  19. System.out.println("map:" + Arrays.toString(map.entrySet().toArray()));
  20. }
  21. }
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }

我们在所有的文档里搜索字段 user 含有 “朝阳”,并返回第一个 page 的结果。上述搜索相当于在 Kibana 中的如下命令:

  1. GET twitter/_search
  2. {
  3. "from": 0,
  4. "size": 2,
  5. "query": {
  6. "match": {
  7. "user": "朝阳"
  8. }
  9. }
  10. }

运行上面的代码。它的显示结果为:

  1. ****************** Search 3
  2. map:[uid=4, country=中国, address=中国北京市朝阳区建国门, province=北京, city=北京, DOB=1980-06-30, location={lon=116.367910, lat=39.718256}, message=123,gogogo, user=朝阳区-老贾, age=42]
  3. map:[uid=5, country=中国, address=中国北京市朝阳区国贸, province=北京, city=北京, DOB=1996-06-18, location={lon=116.467910, lat=39.918256}, message=Happy BirthDay My Friend!, user=朝阳区-老王, age=26]

上面的结果显示 user 字段含有 “朝阳”,并且它的文档数是 2,也就是 page size 是 2。

搜索四:复合查询

在很多的时候,我们使用复合查询来得到所需要的文档。关于复合查询的理解,请参阅我之前的文章 “开始使用 Elasticsearch (2)”。它一般具有如下的一个形式:

  1. POST _search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must" : {
  6. "term" : { "user" : "kimchy" }
  7. },
  8. "filter": {
  9. "term" : { "tag" : "tech" }
  10. },
  11. "must_not" : {
  12. "range" : {
  13. "age" : { "gte" : 10, "lte" : 20 }
  14. }
  15. },
  16. "should" : [
  17. { "term" : { "tag" : "wow" } },
  18. { "term" : { "tag" : "elasticsearch" } }
  19. ],
  20. "minimum_should_match" : 1,
  21. "boost" : 1.0
  22. }
  23. }
  24. }

它由 must,must_not 及 should 组成的布尔查询。

  1. // Search 4:
  2. System.out.println("****************** Search 4");
  3. MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("user", "朝阳");
  4. MatchQueryBuilder matchQueryBuilder1 = new MatchQueryBuilder("address", "北京");
  5. RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("age").from(25).to(30);
  6. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder()
  7. .must(matchQueryBuilder)
  8. .must(matchQueryBuilder1)
  9. .should(rangeQueryBuilder);
  10. SearchSourceBuilder builder4 = new SearchSourceBuilder().query(boolQueryBuilder);
  11. builder4.from(0);
  12. builder4.size(2);
  13. builder4.timeout(new TimeValue(60, TimeUnit.SECONDS));
  14. builder4.sort("DOB", SortOrder.ASC);
  15. SearchRequest searchRequest4 = new SearchRequest();
  16. searchRequest4.indices(INDEX_NAME);
  17. searchRequest4.searchType(SearchType.DFS_QUERY_THEN_FETCH);
  18. searchRequest4.source(builder4);
  19. try {
  20. SearchResponse searchResponse = null;
  21. searchResponse = client.search(searchRequest4, RequestOptions.DEFAULT);
  22. if (searchResponse.getHits().getTotalHits().value > 0) {
  23. SearchHit[] searchHit = searchResponse.getHits().getHits();
  24. for (SearchHit hit : searchHit) {
  25. map = hit.getSourceAsMap();
  26. System.out.println("map:" + Arrays.toString(map.entrySet().toArray()));
  27. }
  28. }
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }

在上面,我们使用 must 及 should 组成的 bool 查询。它相当于在 Kibana 中的如下命令:

  1. GET twitter/_search
  2. {
  3. "from": 0,
  4. "size": 2,
  5. "query": {
  6. "bool": {
  7. "must": [
  8. {
  9. "match": {
  10. "user": "朝阳"
  11. }
  12. },
  13. {
  14. "match": {
  15. "address": "北京"
  16. }
  17. }
  18. ],
  19. "should": [
  20. {
  21. "range": {
  22. "age": {
  23. "gte": 25,
  24. "lte": 30
  25. }
  26. }
  27. }
  28. ]
  29. }
  30. },
  31. "sort": [
  32. {
  33. "DOB": {
  34. "order": "asc"
  35. }
  36. }
  37. ]
  38. }

在 Kibana 中运行上面的命令:

  1. {
  2. "took" : 8,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 2,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [
  17. {
  18. "_index" : "twitter",
  19. "_type" : "_doc",
  20. "_id" : "4",
  21. "_score" : null,
  22. "_source" : {
  23. "user" : "朝阳区-老贾",
  24. "DOB" : "1980-06-30",
  25. "message" : "123,gogogo",
  26. "uid" : 4,
  27. "age" : 42,
  28. "city" : "北京",
  29. "province" : "北京",
  30. "country" : "中国",
  31. "address" : "中国北京市朝阳区建国门",
  32. "location" : {
  33. "lat" : "39.718256",
  34. "lon" : "116.367910"
  35. }
  36. },
  37. "sort" : [
  38. 331171200000
  39. ]
  40. },
  41. {
  42. "_index" : "twitter",
  43. "_type" : "_doc",
  44. "_id" : "5",
  45. "_score" : null,
  46. "_source" : {
  47. "user" : "朝阳区-老王",
  48. "DOB" : "1996-06-18",
  49. "message" : "Happy BirthDay My Friend!",
  50. "uid" : 5,
  51. "age" : 26,
  52. "city" : "北京",
  53. "province" : "北京",
  54. "country" : "中国",
  55. "address" : "中国北京市朝阳区国贸",
  56. "location" : {
  57. "lat" : "39.918256",
  58. "lon" : "116.467910"
  59. }
  60. },
  61. "sort" : [
  62. 835056000000
  63. ]
  64. }
  65. ]
  66. }
  67. }

我们可以看到是按照 DOB 进行排序的。

运行我们的代码:

  1. ****************** Search 4
  2. map:[uid=4, country=中国, address=中国北京市朝阳区建国门, province=北京, city=北京, DOB=1980-06-30, location={lon=116.367910, lat=39.718256}, message=123,gogogo, user=朝阳区-老贾, age=42]
  3. map:[uid=5, country=中国, address=中国北京市朝阳区国贸, province=北京, city=北京, DOB=1996-06-18, location={lon=116.467910, lat=39.918256}, message=Happy BirthDay My Friend!, user=朝阳区-老王, age=26]

在返回结果中,也是按照 DOB 降序来排列的。

也许有的同学要问,为啥 age 为 42 的文档 4 被搜索到了啊?这个就是 should 的作用。如果在 should 里的条件满足,那么搜索的结果就会加分。当然由于我们使用 sort 进行重新排序,所以得到的分数没有任何的意义。

搜索五:highlight

在很多的时候,我们希望搜索的结果是带有 highlight 的那么,我们该怎么办呢?我们可以参考之前的文章 “开始使用 Elasticsearch (2)” 查询 highlighting 部分。

假如我们想实现如下的 highlight:

  1. GET twitter/_search
  2. {
  3. "from": 0,
  4. "size": 2,
  5. "query": {
  6. "bool": {
  7. "must": [
  8. {
  9. "match": {
  10. "user": "朝阳"
  11. }
  12. },
  13. {
  14. "match": {
  15. "address": "北京"
  16. }
  17. }
  18. ],
  19. "should": [
  20. {
  21. "range": {
  22. "age": {
  23. "gte": 25,
  24. "lte": 30
  25. }
  26. }
  27. }
  28. ]
  29. }
  30. },
  31. "sort": [
  32. {
  33. "DOB": {
  34. "order": "asc"
  35. }
  36. }
  37. ],
  38. "highlight": {
  39. "pre_tags": ["<my_tag>"],
  40. "post_tags": ["</my_tag>"],
  41. "fields": {
  42. "user": {}
  43. }
  44. }
  45. }

如上所示,我们定制了 highlight 的 tag: my_tag。上面搜索的返回结果是:

  1. {
  2. "took" : 4,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 2,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [
  17. {
  18. "_index" : "twitter",
  19. "_type" : "_doc",
  20. "_id" : "4",
  21. "_score" : null,
  22. "_source" : {
  23. "user" : "朝阳区-老贾",
  24. "DOB" : "1980-06-30",
  25. "message" : "123,gogogo",
  26. "uid" : 4,
  27. "age" : 42,
  28. "city" : "北京",
  29. "province" : "北京",
  30. "country" : "中国",
  31. "address" : "中国北京市朝阳区建国门",
  32. "location" : {
  33. "lat" : "39.718256",
  34. "lon" : "116.367910"
  35. }
  36. },
  37. "highlight" : {
  38. "user" : [
  39. "<my_tag>朝</my_tag><my_tag>阳</my_tag>区-老贾"
  40. ]
  41. },
  42. "sort" : [
  43. 331171200000
  44. ]
  45. },
  46. {
  47. "_index" : "twitter",
  48. "_type" : "_doc",
  49. "_id" : "5",
  50. "_score" : null,
  51. "_source" : {
  52. "user" : "朝阳区-老王",
  53. "DOB" : "1996-06-18",
  54. "message" : "Happy BirthDay My Friend!",
  55. "uid" : 5,
  56. "age" : 26,
  57. "city" : "北京",
  58. "province" : "北京",
  59. "country" : "中国",
  60. "address" : "中国北京市朝阳区国贸",
  61. "location" : {
  62. "lat" : "39.918256",
  63. "lon" : "116.467910"
  64. }
  65. },
  66. "highlight" : {
  67. "user" : [
  68. "<my_tag>朝</my_tag><my_tag>阳</my_tag>区-老王"
  69. ]
  70. },
  71. "sort" : [
  72. 835056000000
  73. ]
  74. }
  75. ]
  76. }
  77. }

如上所示,“朝” 及 “阳” 分别被标注。它们是分词的结果。在返回结果的 highlight 部分,我们可以看到它们被 <my_tag> 及 </my_tag> 所标注。我们针对 use 字段进行 highlight。那么我们该如何实现这个 highlight 呢?

  1. // Search 5: highlight
  2. System.out.println("****************** Search 5");
  3. HighlightBuilder highlightBuilder = new HighlightBuilder()
  4. .postTags("<mytag>")
  5. .preTags("</mytag>")
  6. .field("user");
  7. MatchQueryBuilder matchQueryBuilder3 = new MatchQueryBuilder("user", "朝阳");
  8. MatchQueryBuilder matchQueryBuilder4 = new MatchQueryBuilder("address", "北京");
  9. RangeQueryBuilder rangeQueryBuilder5 = new RangeQueryBuilder("age").from(25).to(30);
  10. BoolQueryBuilder boolQueryBuilder5 = new BoolQueryBuilder()
  11. .must(matchQueryBuilder)
  12. .must(matchQueryBuilder3)
  13. .should(rangeQueryBuilder5);
  14. SearchSourceBuilder builder5 = new SearchSourceBuilder().query(boolQueryBuilder5);
  15. builder5.from(0);
  16. builder5.size(2);
  17. builder5.timeout(new TimeValue(60, TimeUnit.SECONDS));
  18. builder5.sort("DOB", SortOrder.ASC);
  19. builder5.highlighter(highlightBuilder);
  20. SearchRequest searchRequest5 = new SearchRequest();
  21. searchRequest5.indices(INDEX_NAME);
  22. searchRequest5.searchType(SearchType.DFS_QUERY_THEN_FETCH);;
  23. searchRequest5.source(builder5);
  24. try {
  25. SearchResponse searchResponse = null;
  26. searchResponse = client.search(searchRequest5, RequestOptions.DEFAULT);
  27. System.out.println(searchResponse);
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }

在上面,我们添加了 highlight 的部分。运行上面的结果为:

  1. {
  2. "took":25,
  3. "timed_out":false,
  4. "_shards":{
  5. "total":1,
  6. "successful":1,
  7. "skipped":0,
  8. "failed":0
  9. },
  10. "hits":{
  11. "total":{
  12. "value":2,
  13. "relation":"eq"
  14. },
  15. "max_score":null,
  16. "hits":[
  17. {
  18. "_index":"twitter",
  19. "_type":"_doc",
  20. "_id":"4",
  21. "_score":null,
  22. "_source":{
  23. "user":"朝阳区-老贾",
  24. "DOB":"1980-06-30",
  25. "message":"123,gogogo",
  26. "uid":4,
  27. "age":42,
  28. "city":"北京",
  29. "province":"北京",
  30. "country":"中国",
  31. "address":"中国北京市朝阳区建国门",
  32. "location":{
  33. "lat":"39.718256",
  34. "lon":"116.367910"
  35. }
  36. },
  37. "highlight":{
  38. "user":[
  39. "</mytag>朝<mytag></mytag>阳<mytag>区-老贾"
  40. ]
  41. },
  42. "sort":[
  43. 331171200000
  44. ]
  45. },
  46. {
  47. "_index":"twitter",
  48. "_type":"_doc",
  49. "_id":"5",
  50. "_score":null,
  51. "_source":{
  52. "user":"朝阳区-老王",
  53. "DOB":"1996-06-18",
  54. "message":"Happy BirthDay My Friend!",
  55. "uid":5,
  56. "age":26,
  57. "city":"北京",
  58. "province":"北京",
  59. "country":"中国",
  60. "address":"中国北京市朝阳区国贸",
  61. "location":{
  62. "lat":"39.918256",
  63. "lon":"116.467910"
  64. }
  65. },
  66. "highlight":{
  67. "user":[
  68. "</mytag>朝<mytag></mytag>阳<mytag>区-老王"
  69. ]
  70. },
  71. "sort":[
  72. 835056000000
  73. ]
  74. }
  75. ]
  76. }
  77. }

从上面的输出结果中,我们可以看出来 “朝” 及 “阳” 被分别 highlight 了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/68259
推荐阅读
相关标签
  

闽ICP备14008679号