Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elasticsearch中的I18n搜索和过滤_Search_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Internationalization - Fatal编程技术网 elasticsearch,internationalization,Search,elasticsearch,Internationalization" /> elasticsearch,internationalization,Search,elasticsearch,Internationalization" />

Elasticsearch中的I18n搜索和过滤

Elasticsearch中的I18n搜索和过滤,search,elasticsearch,internationalization,Search,elasticsearch,Internationalization,tldr 如何使用本地化索引匹配和筛选本地化搜索 长版本 我有一个应用程序,其中用户搜索必须在其语言的上下文中完成 在弹性搜索索引中,我希望文档同时具有i18n属性和非i18n属性(我希望避免创建多个索引,每种语言一个索引) 文档的映射应如下所示: 'entry': { 'properties': { 'name' : {'type': 'string'}, /* unlocalized properties */ 'category': { /* localized propertie

tldr

如何使用本地化索引匹配和筛选本地化搜索

长版本

我有一个应用程序,其中用户搜索必须在其语言的上下文中完成

在弹性搜索索引中,我希望文档同时具有i18n属性和非i18n属性(我希望避免创建多个索引,每种语言一个索引)

文档的映射应如下所示:

'entry': {
'properties': {
  'name' : {'type': 'string'}, /* unlocalized properties */
  'category': { /* localized properties */
      "properties" : {
          "lang_fr" : {
              "type" : "string"
          },
          "lang_de" : {
              "type" : "string"
          }
      }
  },}}
因此,我有两个要求:

1) 匹配:执行搜索时,从搜索中排除与用户语言无关的本地化字段(假设用户的语言为“fr”,我想从搜索中排除“de”字段。如何在不指定要搜索的整个字段列表的情况下执行此操作。为了简单起见,我尝试了此操作,但不起作用:

{
  "query": {
    "match": {
      "*.lang_fr": "full_text"
    }
  }
}
但是,
“categories.lang\u fr”:“全文”
工作得很好。但是我不想维护查询中的字段列表。我想要一个像SolR中一样的通用规则

2) 筛选:检索结果时,我希望筛选出与我的用户语言不一致的所有本地化字段。换句话说,使用源筛选器,我希望所有未本地化字段都以“lang”开头,排除所有字段,但包括所有“lang_fr”字段。我尝试了以下操作,但无效:

{
"_source": {
    "include": [ "*", "*.lang_fr" ],
    "exclude": [ "*.lang_*" ],
}
...}
通配符运算符似乎不起作用。如果我指定了
“categories.lang\u de”,则我部分获得了所需的内容
,但是,我不想维护字段列表,我想要一个通用规则。include/exclude操作没有按我所希望的那样工作。唯一实际工作的是一个查询,在该查询中,我专门为所有字段指定要排除的所有语言,例如:

{
"_source": {
    "exclude": [ "categories.lang_de", "categories.lang_en",  "categories.lang_it", 
                         "another_field.lang_de", "catanother_fieldgories.lang_en",  "another_field.lang_it"],
}
...}
用于“fr”搜索

我很惊讶我在谷歌上找不到任何东西。我认为这是i18n应用于elasticsearch的一个非常标准的案例。也许我在ES中对i18n进行了错误的建模


提前感谢!

您可以使用一个利用强大的Lucene表达式语言并允许指定以下内容的

或者您也可以在
fields
参数中指定字段名,如下所示

{
  "query": {
    "query_string": {
      "query": "full_text"
      "fields": ["*.lang_fr"]
    }
  }
}
至于你的第二个,源代码过滤确实是一个不错的选择,但我建议只排除除你正在搜索的语言之外的所有语言。例如,如果搜索是法语,你只需排除所有其他语言,而不必枚举所有字段,只需列出你不想要的所有语言(这会少得多)。这将允许您在进行时添加本地化字段,而无需更改查询

{
"_source": {
    "exclude": [ "*.lang_de", "*.lang_it" ],
}
...}
{
"_source": {
    "exclude": [ "*.lang_de", "*.lang_it" ],
}
...}