【问题标题】:Elastic Search - Tokenization and Multi Match query弹性搜索 - 标记化和多匹配查询
【发布时间】: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 对。 我只需要处理每一对中的一个条目,所以我采用了以下方法(这不是好方法 - 但到目前为止我最终采用了这种方法)

方法

  1. 从索引中的 90 个条目中获取每个条目
  2. 使用分析器进行标记(这会删除不需要的关键字)
  3. 在同一索引中搜索(它检查索引中是否存在相同类型的数据)并过滤标记为已处理。 --> 这个标志将在第一个日志被处理后更新。
  4. 如果没有可用于处理类似数据的标志(70% 匹配),那么我将处理这些日志并将当前日志标志更新为已处理。
  5. 如果任何数据已经存在且标记为已处理,那么我将认为该数据已被处理,我将继续处理下一个数据。

所以理想的目标是只处理 10 个唯一条目中的一个数据。

谢谢,
哈利

【问题讨论】:

    标签: elasticsearch elasticsearch-5 elasticsearch-query


    【解决方案1】:

    多匹配查询在内部使用已分析的匹配查询,这意味着如果没有定义分析器,它们将应用在字段映射(标准)中定义的相同分析器。

    来自多重匹配查询文档

    multi_match 查询基于 match 查询以允许多字段 查询:

    另外,接受分析器、boost、operator、minimum_should_match、 模糊,宽松,如匹配查询中所述。

    因此,您尝试做的是矫枉过正,即使您想更改分析器(在搜索期间需要不同的令牌),您也可以使用 search analyzer 而不是创建令牌,然后在多匹配查询中使用它们.

    【讨论】:

    • 感谢您的即时回复,但我的问题不清楚,所以我编辑了它,请检查编辑部分
    • @Harry 知道了,但你不能在索引本身中删除和优化这些
    • 我们是通过日志存储节拍插入的,因此过滤器无法如此准确地完成,所以有没有办法结合分析器和多匹配查询来查找重复项并更新同一日志中的标志?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多