首页 > 解决方案 > 在 Elasticsearch 中使用多个分析器创建和合并索引

问题描述

因此,我在配置 JSON 文件中定义了两个过滤器。现在,我想一次应用这些过滤器,然后组合结果。

"filter": {
      "autocomplete_filter": {
        "type": "edge_ngram",
        "min_gram": 3,
        "max_gram": 20
      },
      "shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 1,
          "max_shingle_size": 2
      }
    },

例子:

"best mac laptop" -> "best", "mac", "laptop", "best mac", "mac laptop", "bes", "best", "best ", "best m", "best ma", "best mac", ...

像上面一样,我想使用 Shingle 过滤器创建索引,然后我想在原始数据上创建索引自动完成过滤器,然后在单个文档中组合并创建索引。可能吗?到底有没有?

标签: javaelasticsearch

解决方案


因此,在仔细研究了 spring 数据 Elasticsearch 文档之后,我能够使用两个不同的分析器来索引相同的字段。

@Document(indexName = "course-doc")
@Setting(settingPath = "es-config/autocomplete.json")
@Getter
@Setter
public class Course {
  @Id
  long id;

  @MultiField(
      mainField = @Field(type = FieldType.Text, analyzer = "autocomplete_index", searchAnalyzer = "autocomplete_search"),
      otherFields = {@InnerField(suffix = "search", type = FieldType.Text, analyzer = "search_index", searchAnalyzer = "autocomplete_search")})
  String name;
}

自动完成.json

{
  "analysis": {
    "filter": {
      "autocomplete_filter": {
        "type": "edge_ngram",
        "min_gram": 2,
        "max_gram": 20
      },
      "shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 1,
          "max_shingle_size": 10
      }
    },
    "analyzer": {
      "autocomplete_search": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase" ]
      },
      "autocomplete_index": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase", "stop" , "autocomplete_filter" ]
      },
      "search_index": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase" , "shingle_filter" ]
      },
      "standard-analyzer": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase", "stop" ]
      }
    }
  }
}

推荐阅读