GVKun编程网logo

如何使用Java API在Elasticsearch中分析文本?(java elasticsearch api)

16

在本文中,我们将详细介绍如何使用JavaAPI在Elasticsearch中分析文本?的各个方面,并为您提供关于javaelasticsearchapi的相关解答,同时,我们也将为您带来关于#Elas

在本文中,我们将详细介绍如何使用Java API在Elasticsearch中分析文本?的各个方面,并为您提供关于java elasticsearch api的相关解答,同时,我们也将为您带来关于#Elasticsearch常用Java API、Debezium Postgres和ElasticSearch-在ElasticSearch中存储复杂对象、elasticsearch java api 使用elasticsearch 6.x.x版本,客户端使用5.6.10版本、Elasticsearch-使用Java API获取源字段数据的有用知识。

本文目录一览:

如何使用Java API在Elasticsearch中分析文本?(java elasticsearch api)

如何使用Java API在Elasticsearch中分析文本?(java elasticsearch api)

我使用Elasticsearch 1.7.4及其Java
API。目前,我想按用户计数前10个高频搜索词。因此,我必须记录要搜索的用户类型的查询文本的单词,并且在记录单词之前必须分析查询文本。如链接所示,我找到了分析文本的宁静方法,但是在TransportClient中找不到api。

有谁知道如何使用Java api或其他方式而不是请求静态API来分析Elasticsearch中的文本?

答案1

小编典典

使用文档中的示例(正在使用standard分析器分析文本“这是测试” ),下面是一个示例,说明如何使用Java API完成相同的分析:

TransportClient client = new TransportClient();AnalyzeRequest request = (new AnalyzeRequest("this is a test")).analyzer("standard");List<AnalyzeResponse.AnalyzeToken> tokens = client.admin().indices().analyze(request).actionGet().getTokens();for (AnalyzeResponse.AnalyzeToken token : tokens){    // do something with each token...}

希望这可以帮助!

#Elasticsearch常用Java API

#Elasticsearch常用Java API

ElasticSearch 6.7

1.新建索引

    /**
     * 新建索引
     * @param indexName
     * @return
     * @throws Exception
     */
    @PostMapping(value = "/createIndex")
    public String createIndex(@RequestParam("indexName") String indexName) {

        log.info("indexName:{}", indexName);

        return indexService.createIndex(indexName);
    }


    /**
     * 新建index
     *
     * @param name
     * @return
     * @throws IOException
     */

    public String createIndex(String name) {

        String newIndex = "";
        try {
            String mappingPath = "/mappings/" + name + "_mapping.json";
            String indexSettingSource = FileUtils.readFileLinesToJson(mappingPath).toString();
            CreateIndexResponse createIndexResponse = createIndex(gson.fromJson(indexSettingSource, CustomIndexSetting.class));
            newIndex = createIndexResponse.index();
        } catch (IOException e) {
            log.debug(e.getMessage());
        }
        return newIndex;
    }


    public CreateIndexResponse createIndex(CustomIndexSetting indexSetting) throws IOException {

        String indeName = indexSetting.getIndexName() + "-" + DateTime.now().toString("yy.MM.dd-HHmmss");

        return indexDao.createIndex(indeName, indexSetting.getIndexSource().toString());
    }


    /**
     * 创建index mappings, settings
     * @param indexName 索引名称
     * @param jsonSource 设置的json, 文档地址:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.7/java-rest-high-create-index.html
     */
    public CreateIndexResponse createIndex(String indexName, String jsonSource) throws IOException {

        CreateIndexRequest request = new CreateIndexRequest(indexName);
        request.source(jsonSource, XContentType.JSON);

        /**
         * The following arguments can optionally be provided:
         */

        //Timeout to wait for the all the nodes to acknowledge the index creation as a TimeValue
        request.setTimeout(TimeValue.timeValueMinutes(2));

        //Timeout to connect to the master node as a TimeValue
        request.setMasterTimeout(TimeValue.timeValueMinutes(1));

        //The number of active shard copies to wait for before the create index API returns a response, as an ActiveShardCount
        request.waitForActiveShards(ActiveShardCount.DEFAULT);

        return restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);

    }

2.获取以前缀开头的索引

    /**
     * 取得以prefixIndexName开头的所有index
     * @param prefixIndexName
     * @return
     */
    public String[] getIndices(String prefixIndexName) {

        try {
            String name = prefixIndexName + "*";
            GetIndexResponse indexResponse = restHighLevelClient.indices().get(new GetIndexRequest(name), RequestOptions.DEFAULT);

            String[] indexsName = indexResponse.getIndices();

            log.info("indexsName:{}", indexsName);
            return indexsName;
        } catch (Exception e) {
            log.debug(e.getMessage());
        }
        return null;
    }

3.判断索引是否存在

    /**
     * 判断索引名是否存在
     * @param indexName
     * @return
     * @throws IOException
     */
    public boolean existsIndex(String indexName) throws IOException{
        boolean existsIndex = restHighLevelClient.indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
        return existsIndex;
    }

4.判断索引别名是否存在

    /**
     * 判断别名索引是否存在
     * @param aliasName
     * @return
     * @throws IOException
     */
    public boolean existsAlias(String aliasName) throws IOException{
        boolean existsAlias = restHighLevelClient.indices().existsAlias(new GetAliasesRequest().aliases(aliasName), RequestOptions.DEFAULT);
        return existsAlias;
    }

5.查询索引数据量

    /**
     * 查询索引的数据总量
     * @param indexName
     * @return
     * @throws IOException
     */
    public SearchHits searchAll(String indexName) throws IOException{

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        //builder
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(boolQueryBuilder);

        //构建SearchRequest
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);
        searchRequest.source(builder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();
        return hits;
    }

6.滚动查询数据

    /**
     * 滚动查询数据
     * @param indexName
     * @param utime
     */
    public List<String> scrollSearchAll(String indexName, String utime) throws IOException{

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.rangeQuery("utime").lt(utime).gt("946656000"));//946656000为2000-01-01 00:00:00

        //builder
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(boolQueryBuilder)
                .size(500);

        log.info("builder:{}", builder);
        //构建SearchRequest
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexName);
        searchRequest.source(builder);

        Scroll scroll = new Scroll(new TimeValue(600000));
        searchRequest.scroll(scroll);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest);

        String scrollId = searchResponse.getScrollId();
        SearchHit[] hits = searchResponse.getHits().getHits();
        List<String> resultSearchHit = new ArrayList<>();
        while (ArrayUtils.isNotEmpty(hits)) {
            for (SearchHit hit : hits) {
                log.info("准备删除的数据hit:{}", hit);
                resultSearchHit.add(hit.getId());
            }
            //再次发送请求,并使用上次搜索结果的ScrollId
            SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
            searchScrollRequest.scroll(scroll);
            SearchResponse searchScrollResponse = restHighLevelClient.searchScroll(searchScrollRequest);
            scrollId = searchScrollResponse.getScrollId();
            hits = searchScrollResponse.getHits().getHits();
        }
        //及时清除es快照,释放资源
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        restHighLevelClient.clearScroll(clearScrollRequest);
        return resultSearchHit;
    }

7.根据别名查找索引名

    /**
     * 根据别名查找索引名
     * @param aliasName
     * @return
     * @throws IOException
     */
    public String getIndexByAlias(String aliasName) throws IOException{
        String indexName = "";
        Map map = restHighLevelClient.indices().getAlias(new GetAliasesRequest(aliasName), RequestOptions.DEFAULT).getAliases();
        Iterator iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            indexName = iterator.next().toString();
        }
        return indexName;
    }

8.添加索引别名

    /**
     * 添加索引别名
     * @param indexName
     * @param aliasName
     * @return
     * @throws IOException
     */
    public boolean addAlias(String indexName, String aliasName) throws IOException{

        boolean isAddAlias = restHighLevelClient.indices().updateAliases(new IndicesAliasesRequest().addAliasAction(IndicesAliasesRequest.AliasActions.add().alias(aliasName).index(indexName)))
                .isAcknowledged();

        return isAddAlias;
    }

9.替换别名

    /**
     * 将别名替换到新索引上
     * @param indexName
     * @param oldName
     * @param aliasName
     * @return
     * @throws IOException
     */
    public boolean replaceAlias(String indexName, String oldName, String aliasName) throws IOException {

        boolean isReplaceAlias = restHighLevelClient.indices().updateAliases(new IndicesAliasesRequest()
                .addAliasAction(IndicesAliasesRequest.AliasActions.remove().alias(aliasName).index(oldName))
                .addAliasAction(IndicesAliasesRequest.AliasActions.add().alias(aliasName).index(indexName))).isAcknowledged();

        return isReplaceAlias;
    }

10.删除索引

 

Debezium Postgres和ElasticSearch-在ElasticSearch中存储复杂对象

Debezium Postgres和ElasticSearch-在ElasticSearch中存储复杂对象

您需要使用发件箱模式,请参见https://debezium.io/documentation/reference/1.2/configuration/outbox-event-router.html

或者您可以使用聚合对象,请参见 https://github.com/debezium/debezium-examples/tree/master/jpa-aggregations https://github.com/debezium/debezium-examples/tree/master/kstreams-fk-join

elasticsearch java api 使用elasticsearch 6.x.x版本,客户端使用5.6.10版本

elasticsearch java api 使用elasticsearch 6.x.x版本,客户端使用5.6.10版本

es的添加数据方法中 索引index字段不允许为大写字符串,必须全部为小写字符串

public void bulkCreatIndex(){

TransportClient client = es.getClient();

int i = 1;

// bulk单次批操作量
final int BatchSize = 10000;
BulkRequestBuilder bulkRequest = client.prepareBulk();
// 遍历JSONArray,数据量庞大时,for循环比foreach循环效率更高一些
for (i = 1; i <= jsonArray.size(); i++) {
// setSource为上传的文本文档
bulkRequest.add(client.prepareIndex(index.toLowerCase(), type).setSource(jsonArray.getJSONObject(i-1).toString()));
// 每10000条数据执行一次bulk批量操作
if (0 == i % BatchSize) {
bulkRequest.execute().actionGet();
bulkRequest = client.prepareBulk();//此处是bulkRequest执行完成之后会重新创建一个bulkRequest避免下次提交出现重复的数据,如果是一次性全部提交可以不用使用此处
}
}
bulkRequest.execute().actionGet();
bulkRequest = client.prepareBulk();

}

查询方法

public void search(){

Client client = esmanager.getClient();

RangeQueryBuilder rangequerybuilder = QueryBuilders.rangeQuery("startdate").from(startdate).to(enddate);//建立查询是所使用条件startdate 从from  startdate开始至enddate结束,

SearchRequestBuilder responsebuilder = client.prepareSearch(index).setTypes(type);//创建查询使用方法
SearchResponse myresponse = responsebuilder
.setQuery(QueryBuilders.boolQuery().must(rangequerybuilder))//添加查询条件
.setFrom(from).setSize(size).addSort("startdate", SortOrder.ASC) // 分页 并且根据startdate进行排序
.setExplain(true).execute().actionGet();
SearchHits hits = myresponse.getHits();//searchhits 为查询结果相当于jdbc中的ResultSet
for (int i = 0; i < hits.getHits().length; i++) {

hits.getHits()[i].getSourceAsMap().get(key)

}

 根据业务进行方法的修改,本方法制作一个demo参考为主。

Elasticsearch-使用Java API获取源字段数据

Elasticsearch-使用Java API获取源字段数据

如何解决Elasticsearch-使用Java API获取源字段数据?

尝试fetchSource()像这样使用:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
    .query(query)
    .fetchSource(new String[] {
      "oid", 
      "events.activityoid", 
      "events.worktime"
    }, null);

解决方法

我正在使用带有笑话的elasticsearch(作为Java客户端)。我需要嵌套文档中的某些字段,由于无法将嵌套字段成对出现,因此需要’_source’来获取它们。

这是在ES查询 链接中获取它们的先前问题,并且效果很好。

但是无法将其查询转换为开玩笑的代码。下面是我的尝试。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query( 
            query
        )
        .fields(      // need _source but no method.
          "oid","_source.events.activityoid","_source.events.worktime");

关于如何使用Java API在Elasticsearch中分析文本?java elasticsearch api的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于#Elasticsearch常用Java API、Debezium Postgres和ElasticSearch-在ElasticSearch中存储复杂对象、elasticsearch java api 使用elasticsearch 6.x.x版本,客户端使用5.6.10版本、Elasticsearch-使用Java API获取源字段数据的相关信息,请在本站寻找。

本文标签: