ES-3:Java的 ElasticsearchTemplate Or ElasticsearchRepository 高亮(highlight)

15 篇文章 0 订阅
5 篇文章 0 订阅

  目录

安装elasticsearch

maven

数据来源: 网易数据

Java代码


安装elasticsearch

docker run -p 9200:9200 -p 9300:9300 --name es_643 -d elasticsearch:6.4.3

maven

    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.1.16.RELEASE</version>
    </parent>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

数据来源: 网易数据

https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=334061612053

Java代码

import com.alibaba.fastjson.JSONObject;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import lombok.Data;
import lombok.ToString;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder.BoundaryScannerType;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.noear.esearchx.EsContext;
import org.noear.esearchx.EsGlobal;
import org.noear.esearchx.model.EsData;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ResultsExtractor;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

public class EsTest {

  public static void add(JSONObject jsonObject, List<IndexQuery> queries, String pid,
      String pname) {
    String name = jsonObject.getString("name");
    String id = jsonObject.getString("id");
    JSONObject total = jsonObject.getJSONObject("total");
    Integer confirm = total.getInteger("confirm");
    Integer input = total.getInteger("input");
    Integer severe = total.getInteger("severe");
    Integer heal = total.getInteger("heal");
    Integer dead = total.getInteger("dead");
    Integer suspect = total.getInteger("suspect");
    Area area = new Area();
    area.setId(id);
    area.setPid(pid);
    area.setPname(pname);
    area.setName(name);
    area.setConfirm(confirm);
    area.setInput(input);
    area.setSevere(severe);
    area.setHeal(heal);
    area.setDead(dead);
    area.setSuspect(suspect);
    IndexQuery indexQuery = new IndexQuery();
    indexQuery.setId(id.toString());
    indexQuery.setObject(area);
    indexQuery.setIndexName("area");
    queries.add(indexQuery);
  }

  public static void main(String[] args) throws Exception {
//    String data = HttpUtil.get(
//        "https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=334061612053");
//    JSONObject parseObject = JSONObject.parseObject(data);
//    JSONObject dataobj = parseObject.getJSONObject("data");
//    JSONArray areaTree = dataobj.getJSONArray("areaTree");
//    List<IndexQuery> queries = new ArrayList<>();
//    for (int i = 0; i < areaTree.size(); i++) {
//      JSONObject jsonObject = areaTree.getJSONObject(i);
//      JSONArray children = jsonObject.getJSONArray("children");
//      String id = jsonObject.getString("id");
//      String name = jsonObject.getString("name");
//      for (int i1 = 0; i1 < children.size(); i1++) {
//        JSONObject childrenJSONObject = children.getJSONObject(i1);
//        String childrenid = childrenJSONObject.getString("id");
//        String childrenname = childrenJSONObject.getString("name");
//        JSONArray childrenJSONObjectJSONArray = childrenJSONObject.getJSONArray("children");
//        for (int i2 = 0; i2 < childrenJSONObjectJSONArray.size(); i2++) {
//          JSONObject childrenJSONObject2 = childrenJSONObjectJSONArray.getJSONObject(i2);
//          add(childrenJSONObject2, queries, childrenid, childrenname);
//        }
//        add(childrenJSONObject, queries, id, name);
//      }
//      add(jsonObject, queries, "-1", "");
//
//
//    }
    Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build();
    TransportClient transportClient = new PreBuiltTransportClient(settings);
    transportClient.addTransportAddress(
        new TransportAddress(InetAddress.getByName("localhost"), 9300));
    ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(transportClient);
//    boolean exists = elasticsearchTemplate.indexExists(Area.class);
//    System.out.println(exists);
//    if (exists) {
//      boolean deleteIndex = elasticsearchTemplate.deleteIndex(Area.class);
//      System.out.println(deleteIndex);
//    }
//    boolean index = elasticsearchTemplate.createIndex(Area.class);
//    System.out.println(index);
//    elasticsearchTemplate.bulkIndex(queries);
//    queries.clear();

    //mysql =
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("name.keyword","中国"));
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql in
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.withQuery(QueryBuilders.termsQuery("name.keyword", "美国", "日本本土"));
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql like
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.withQuery(QueryBuilders.wildcardQuery("name.keyword", "*斯坦*"));
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());
    //mysql >10000
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.withQuery(QueryBuilders.rangeQuery("confirm").from(1000000));
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql   between  1000 and 10000
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.withQuery(QueryBuilders.rangeQuery("confirm").from(1000).to(10000));
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql   is null
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//    ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("input");
//    boolQueryBuilder.mustNot(existsQueryBuilder);
//    nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql   is not null
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//    ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("input");
//    boolQueryBuilder.must(existsQueryBuilder);
//    nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql   order by
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    FieldSortBuilder sortBuilder = SortBuilders.fieldSort("confirm").order(SortOrder.DESC);
//    FieldSortBuilder sortBuilder = SortBuilders.fieldSort("confirm").order(SortOrder.ASC);
//    nativeSearchQueryBuilder.withSort(sortBuilder);
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    System.out.println(areas.getContent());

    //mysql   max min avg
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.addAggregation(
//        AggregationBuilders.max("max_confirm").field("confirm").valueType(ValueType.LONG));
//    nativeSearchQueryBuilder.addAggregation(
//        AggregationBuilders.min("min_confirm").field("confirm").valueType(ValueType.LONG));
//    nativeSearchQueryBuilder.addAggregation(
//        AggregationBuilders.avg("avg_confirm").field("confirm").valueType(ValueType.LONG));
//    nativeSearchQueryBuilder.addAggregation(
//        AggregationBuilders.sum("sum_confirm").field("confirm").valueType(ValueType.LONG));
//    nativeSearchQueryBuilder.addAggregation(
//        AggregationBuilders.stats("stats_confirm").field("confirm").valueType(ValueType.LONG));
//    nativeSearchQueryBuilder.withFields("id");
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    InternalMax maxConfirm = (InternalMax) areas.getAggregation("max_confirm");
//    InternalMin minConfirm = (InternalMin) areas.getAggregation("min_confirm");
//    InternalAvg avgConfirm = (InternalAvg) areas.getAggregation("avg_confirm");
//    InternalSum sumConfirm = (InternalSum) areas.getAggregation("sum_confirm");
//    InternalStats statsConfirm = (InternalStats) areas.getAggregation("stats_confirm");
//    System.out.println(BigDecimal.valueOf(maxConfirm.getValue()));
//    System.out.println(BigDecimal.valueOf(minConfirm.getValue()));
//    System.out.println(BigDecimal.valueOf(avgConfirm.getValue()).setScale(0, RoundingMode.HALF_UP));
//    System.out.println(BigDecimal.valueOf(sumConfirm.getValue()));
//    System.out.println("--------------------Stats---------------------------");
//    System.out.println(BigDecimal.valueOf(statsConfirm.getMax()));
//    System.out.println(BigDecimal.valueOf(statsConfirm.getMin()));
//    System.out.println(BigDecimal.valueOf(statsConfirm.getAvg()));
//    System.out.println(BigDecimal.valueOf(statsConfirm.getSum()));
//    System.out.println(BigDecimal.valueOf(statsConfirm.getCount()));

//    //mysql  select max(),min(),count(),sum(),avg()    group by
//    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.addAggregation(
//        AggregationBuilders.terms("pname").field("pname.keyword").size(100)
//            .subAggregation(AggregationBuilders.stats("stats_confirm").field("confirm")));
//    nativeSearchQueryBuilder.withFields("id");
//    nativeSearchQueryBuilder.withPageable(new PageRequest(0, 1));
//    NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//    AggregatedPage<Area> areas = elasticsearchTemplate.queryForPage(searchQuery, Area.class);
//    StringTerms aggregation = (StringTerms) areas.getAggregation("pname");
//    System.out.println(aggregation);

    // highlight
    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//    nativeSearchQueryBuilder.withHighlightBuilder(
//        new HighlightBuilder().field("name.keyword").preTags("<red>").postTags("</red>")
//            .boundaryScannerType(BoundaryScannerType.SENTENCE).boundaryScannerLocale("zh_CN"));
    nativeSearchQueryBuilder.withHighlightFields(
        new HighlightBuilder.Field("name.keyword").postTags("</red>").preTags("<red>")
            .boundaryScannerType(BoundaryScannerType.WORD));
    nativeSearchQueryBuilder.withQuery(QueryBuilders.wildcardQuery("name.keyword", "*日*"));
    NativeSearchQuery build = nativeSearchQueryBuilder.build();
    Page<Area> areas = elasticsearchTemplate.queryForPage(build, Area.class,
        new SearchResultMapper() {
          @Override
          public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz,
              Pageable pageable) {

            SearchHits hits = response.getHits();
            Iterator<SearchHit> iterator = hits.iterator();
            List<Area> list = new ArrayList<>();
            while (iterator.hasNext()) {
              SearchHit next = iterator.next();
              Map<String, HighlightField> highlightFields = next.getHighlightFields();
              HighlightField highlightField = highlightFields.get("name.keyword");
              Text[] fragments = highlightField.getFragments();
              StringBuilder builder = new StringBuilder();
              for (int i = 0; i < fragments.length; i++) {
                Text fragment = fragments[i];
                builder.append(fragment.string());
              }
              String sourceAsString = next.getSourceAsString();
              Area area = JSONObject.parseObject(sourceAsString, Area.class);
              area.setName(builder.toString());
              list.add(area);
            }
            return (AggregatedPage<T>) new AggregatedPageImpl<Area>(list, pageable,
                hits.getTotalHits(), hits.getMaxScore());
          }
        });
    System.out.println(areas);

  }

}

@Data
@ToString
@Document(indexName = "area")
class Area {

  @Id
  private String id;
  private String pid;
  @Field(type = FieldType.Keyword)
  private String name;
  @Field(type = FieldType.Keyword)
  private String pname;
  private Integer confirm;
  private Integer input;
  private Integer severe;
  private Integer heal;
  private Integer dead;
  private Integer suspect;
}

cd C:\Program Files\FlightGear fgfs --fg-root=C:\Program Files\FlightGear\data --aircraft=ufo --in-air --fdm=null --telnet=5501 --telnet=5502 --telnet=5503 --disable-ai-traffic --disable-real-weather-fetch --disable-random-objects --disable-terrasync --disable-clouds --disable-sound --disable-panel --disable-hud --disable-specular-highlight --timeofday=noon --prop:/sim/rendering/multi-sample-buffers=1 --prop:/sim/rendering/multi-samples=2 --prop:/sim/rendering/draw-mask-clouds=false --prop:/sim/rendering/draw-mask-terrain=true --prop:/sim/rendering/draw-mask-objects=true --prop:/sim/rendering/draw-mask-lights=true --prop:/sim/rendering/draw-mask-internal=true --prop:/sim/rendering/draw-mask-cockpit=true --prop:/sim/rendering/draw-mask-effects=true --prop:/sim/rendering/draw-mask-overlay=true --prop:/sim/rendering/draw-mask-world=true --prop:/sim/rendering/draw-mask-panel=true --prop:/sim/rendering/draw-mask-vr=true --prop:/sim/rendering/draw-mask-2d=true --prop:/sim/rendering/draw-mask-3d=true --prop:/sim/rendering/draw-mask-sky=true --prop:/sim/rendering/draw-mask-shadows=true --prop:/sim/rendering/draw-mask-cabin=true --prop:/sim/rendering/draw-mask-weather=true --prop:/sim/rendering/draw-mask-stereo=true --prop:/sim/rendering/draw-mask-internal-cockpit=true --prop:/sim/rendering/draw-mask-internal-windows=true --prop:/sim/rendering/draw-mask-internal-instruments=true --prop:/sim/rendering/draw-mask-internal-overlay=true --prop:/sim/rendering/draw-mask-internal-effects=true --prop:/sim/rendering/draw-mask-internal-lights=true --prop:/sim/rendering/draw-mask-internal-world=true --prop:/sim/rendering/draw-mask-internal-panel=true --prop:/sim/rendering/draw-mask-internal-3d=true --prop:/sim/rendering/draw-mask-internal-sky=true --prop:/sim/rendering/draw-mask-internal-cabin=true --prop:/sim/rendering/draw-mask-internal-weather=true --prop:/sim/rendering/draw-mask-internal-stereo=true --prop:/sim/rendering/draw-mask-internal-shadow=true --prop:/sim/rendering/draw-mask-internal-stall=true --prop:/sim/rendering/draw-mask-internal-aoa=true --prop:/sim/rendering/draw-mask-internal-thermal=false --prop:/sim/rendering/draw-mask-internal-ice=false --prop:/sim/rendering/draw-mask-internal-glass=true --prop:/sim/rendering/draw-mask-internal-dead=true --prop:/sim/rendering/draw-mask-internal-reflection=true --telnet=127.0.0.1:5501 --disable-panel --disable-hud --disable-specular-highlight --disable-clouds --disable-sound --timeofday=noon --enable-hud-3d=no --enable-hud-2d=yes --enable-panel=no --enable-sound=no程序显示错误
05-10
这个命令有些问题。你需要在命令行中输入这个命令,并且将其中的双引号去掉。此外,你需要确保FlightGear已经安装在C:\Program Files\FlightGear目录下,并且你已经选择了一个可用的飞行器(例如: ufo)。最后,如果你需要使用telnet,你需要指定不同的端口。以下是更正后的命令: ``` cd C:\Program Files\FlightGear fgfs --fg-root=C:\Program Files\FlightGear\data --aircraft=ufo --in-air --fdm=null --telnet=5501 --telnet=5502 --telnet=5503 --disable-ai-traffic --disable-real-weather-fetch --disable-random-objects --disable-terrasync --disable-clouds --disable-sound --disable-panel --disable-hud --disable-specular-highlight --timeofday=noon --prop:/sim/rendering/multi-sample-buffers=1 --prop:/sim/rendering/multi-samples=2 --prop:/sim/rendering/draw-mask-clouds=false --prop:/sim/rendering/draw-mask-terrain=true --prop:/sim/rendering/draw-mask-objects=true --prop:/sim/rendering/draw-mask-lights=true --prop:/sim/rendering/draw-mask-internal=true --prop:/sim/rendering/draw-mask-cockpit=true --prop:/sim/rendering/draw-mask-effects=true --prop:/sim/rendering/draw-mask-overlay=true --prop:/sim/rendering/draw-mask-world=true --prop:/sim/rendering/draw-mask-panel=true --prop:/sim/rendering/draw-mask-vr=true --prop:/sim/rendering/draw-mask-2d=true --prop:/sim/rendering/draw-mask-3d=true --prop:/sim/rendering/draw-mask-sky=true --prop:/sim/rendering/draw-mask-shadows=true --prop:/sim/rendering/draw-mask-cabin=true --prop:/sim/rendering/draw-mask-weather=true --prop:/sim/rendering/draw-mask-stereo=true --prop:/sim/rendering/draw-mask-internal-cockpit=true --prop:/sim/rendering/draw-mask-internal-windows=true --prop:/sim/rendering/draw-mask-internal-instruments=true --prop:/sim/rendering/draw-mask-internal-overlay=true --prop:/sim/rendering/draw-mask-internal-effects=true --prop:/sim/rendering/draw-mask-internal-lights=true --prop:/sim/rendering/draw-mask-internal-world=true --prop:/sim/rendering/draw-mask-internal-panel=true --prop:/sim/rendering/draw-mask-internal-3d=true --prop:/sim/rendering/draw-mask-internal-sky=true --prop:/sim/rendering/draw-mask-internal-cabin=true --prop:/sim/rendering/draw-mask-internal-weather=true --prop:/sim/rendering/draw-mask-internal-stereo=true --prop:/sim/rendering/draw-mask-internal-shadow=true --prop:/sim/rendering/draw-mask-internal-stall=true --prop:/sim/rendering/draw-mask-internal-aoa=true --prop:/sim/rendering/draw-mask-internal-thermal=false --prop:/sim/rendering/draw-mask-internal-ice=false --prop:/sim/rendering/draw-mask-internal-glass=true --prop:/sim/rendering/draw-mask-internal-dead=true --prop:/sim/rendering/draw-mask-internal-reflection=true ``` 请注意,如果你需要使用telnet连接到FlightGear,你需要在另一个命令行窗口中输入telnet命令,例如: ``` telnet localhost 5501 ``` 这将连接到FlightGear的第一个telnet端口。如果你想连接到其他端口,你需要相应地更改端口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值