在本文中,我们将详细介绍如何使用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)
- #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)
我使用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 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中存储复杂对象
您需要使用发件箱模式,请参见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版本
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获取源字段数据?
尝试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获取源字段数据的相关信息,请在本站寻找。
本文标签: