多语言弹性搜索索引

时间:2014-04-24 19:34:23

标签: elasticsearch multilingual analyzer stop-words stemming

我正在使用不同的语言索引一堆文档,据我所知,我可以通过使用_analyzer映射在文档字段之一的索引时指定每个文档使用哪个分析器:

请参阅http://www.elasticsearch.org/guide/reference/mapping/analyzer-field.html

本质上,法语文档在语言字段设置为“french”时表示Elasticsearch需要应用法语词干规则并删除法语停用词。

现在我必须在查询时指定分析器,以便Elasticsearch可以在实际处理之前将相同的词干规则应用于查询吗?如果是这样,那么这有点令人失望,因为我希望能够搜索整个索引,最终提供一个“应该”条款,支持某种语言的文档而不是其他语言。

我不知道的是,Elasticsearch是否通过应用到目前为止在索引中使用的每个分析器来构建多个查询。如果没有,我看到的唯一解决方案是将文档根据其语言分割为不同的类型,然后并行激发多个查询,并在客户端上具有某种汇总功能,这些功能将合并结果并按其分数对其进行排序。但是,即使我可以发送批量查询(限制网络往返),该解决方案显然不是最佳的。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以为索引和搜索定义单独的分析器:

 "my_field":{
    "type":"string",
    "index_analyzer":"my_index_analyzer",
    "search_analyzer":"my_search_analyzer"
 }

您还可以在索引设置中指定默认分析器 - 这是现实生活中的示例:

"settings":{
    "number_of_shards":5,
    "number_of_replicas":1,
    "analysis":{
        "analyzer":{
            "default_index":{
                "type":"custom",
                "tokenizer":"whitespace",
                "filter":[
                    "trim",
                    "lowercase",
                    "asciifolding"
                ]
            },
            "default_search":{
                "type":"custom",
                "tokenizer":"keyword",
                "filter":[
                    "trim",
                    "lowercase",
                    "asciifolding"
                ]
            }
        }
    }
}

这样您就不必明确指定_analyzer字段