【发布时间】:2020-11-10 10:46:02
【问题描述】:
我需要在 Elastic Search 的单个查询中执行标记化和多重匹配。
目前, 1)我正在使用分析器获取如下标记
String text = // 4 line log data;
List<AnalyzeToken> analyzeTokenList = new ArrayList<AnalyzeToken>();
AnalyzeRequestBuilder analyzeRequestBuilder = this.client.admin().indices().prepareAnalyze();
for (String newIndex : newIndexes) {
analyzeRequestBuilder.setIndex(newIndex);
analyzeRequestBuilder.setText(text);
analyzeRequestBuilder.setAnalyzer(analyzer);
Response analyzeResponse = analyzeRequestBuilder.get();
analyzeTokenList.addAll(analyzeResponse.getTokens());
}
然后,我将遍历AnalyzeToken并获取令牌列表,
List<String> tokens = new ArrayList<String>();
for (AnalyzeToken token : tokens)
{
tokens.addAll(token.getTerm().replaceAll("\\s+"," "));
}
然后使用标记和框架多重匹配查询,如下所示,
String query = "";
for(string data : tokens) {
query = query + data;
}
MultiMatchQueryBuilder multiMatchQueryBuilder = new MultiMatchQueryBuilder(query, "abstract", "title");
Iterable<Document> result = documentRepository.search(multiMatchQueryBuilder);
根据结果,我正在检查数据库中是否存在类似的数据。
是否可以组合为单个查询 - 分析和多重匹配查询作为单个查询? 任何帮助表示赞赏!
编辑: 问题陈述:假设我在一个索引中有 90 个条目,其中该索引中的每 10 个条目都是相同的(不完全匹配,但会有 70% 匹配),所以我将有 9 对。 我只需要处理每一对中的一个条目,所以我采用了以下方法(这不是好方法 - 但到目前为止我最终采用了这种方法)
方法:
- 从索引中的 90 个条目中获取每个条目
- 使用分析器进行标记(这会删除不需要的关键字)
- 在同一索引中搜索(它检查索引中是否存在相同类型的数据)并过滤标记为已处理。 --> 这个标志将在第一个日志被处理后更新。
- 如果没有可用于处理类似数据的标志(70% 匹配),那么我将处理这些日志并将当前日志标志更新为已处理。
- 如果任何数据已经存在且标记为已处理,那么我将认为该数据已被处理,我将继续处理下一个数据。
所以理想的目标是只处理 10 个唯一条目中的一个数据。
谢谢,
哈利
【问题讨论】:
标签: elasticsearch elasticsearch-5 elasticsearch-query