Elasticsearch-嵌套-映射-多目标别名或仅指定每个文档要使用的1个多字段子字段

问题描述 投票:0回答:1

我们有一个要从solr迁移到elasticsearch的应用程序。我正在努力寻找执行以下操作的正确方法(我们有10个这样的字段)。

我们有一个文本字段,该文本字段将根据语言使用某些分析器进行索引和搜索。但是需要使用相同的名称进行搜索。因此,在Solr中,我们可以有一个“ title_fr”和“ title_en”字段,并具有一个别名设置,该别名设置将在我们搜索“ title”字段时返回/搜索这两个字段,但在任何时间点,我们只会填充其中一个字段每个文档,因此可行。

现在,我知道在Elasticsearch中,别名只能有1个目标,因此我开始研究多字段。但是,我可以看到的多字段问题是它存储,创建并为其中的每个子字段建立索引。因此,如果我有一个名为title的多字段,然后是一个名为title.en的子字段,又有一个名为title.fr的子字段,那么如果我添加一个标题的索引,它将使用指定的分析器添加到title.en和title.fr中。这成为一个问题,因为标题搜索将触发搜索分析器同时搜索两者,并以相反的语言返回潜在的误报。更不用说它还使我们的索引大小增加了一倍。

我见过的其他选项是为每种语言创建索引并创建交叉索引别名。

如果有帮助,我也使用C#Nest来完成这项工作。

c# elasticsearch indexing nest
1个回答
0
投票

您可以将title_fr和title_en作为单独的字段

映射:

"mappings":{
    "properties":{
        "title_fr":{
            "type":"text",
            "analyzer":<your_analyzer>                                
        },
        "title_en":{
            "type":"text",
            "analyzer":<your_analyzer>                                
        }
    }
}

您也可以将它们设置为对象或嵌套类型

"title":{
    type:"object",
    "properties":{
        "title_fr":{
            "type":"text",
            "analyzer":"your_analyzer"
        },
        "title_en":{
            "type":"text",
            "analyzer":"your_analyzer"
        }
    }
}

elasticsearch中有许多可用选项来查询多个字段上的文本例如您可以使用multi_match

{
    "query": {
        "multi_match" : {
            "query":    "<text>",
            "fields": [ "title_fr", "title_en" ]  --> or title.title_fr,title.title_en 
        }
    }
}

Query_string

{
    "query" : {
        "query_string" : {
            "query" : "<text>",
            "fields"  : [ "title_fr", "title_en" ]  --> or title.title_fr,title.title_en 
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.