当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:如何在字段中添加语言分析器?

沈畅
2023-03-14

我有一个法语单词索引。我想在索引属性上应用一个分析器。假设我有一个标题属性,我想将其视为“法国属性”。我试过这个(在基巴纳):

PUT thing/_mappings/thing
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "french",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
  }
}

但它导致:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Mapper for [title] conflicts with existing mapping in other types:\n[mapper [title] has different [analyzer]]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Mapper for [title] conflicts with existing mapping in other types:\n[mapper [title] has different [analyzer]]"
  },
  "status": 400
}

我不明白为什么我会有这个错误。如果我显示映射(GET thing/u mappings),它不包含现有的分析器(除非我误解了什么):

 // ...
    "title": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      }
    }
  }

如何将我的title属性视为法国属性?(来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html)


共有1个答案

明利
2023-03-14

如果在创建字段时未指定,则不允许更改标题字段的分析器,默认情况下,标题字段是标准的。

您需要删除索引,更改映射以满足您的需求,然后重新索引数据。

另一种解决方案是使用适当的分析器向标题字段添加另一个子字段:

PUT thing/_mappings/thing
{
  "properties": {
    "title": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        },
        "french": {                 <--- add this
          "type": "text",
          "analyzer": "french"
        }
      }
    }
  }
}

运行此操作后,您无需重新上传所有1GB数据,只需调用

POST thing/_update_by_query

以拾取新的子字段。

第二种方法的唯一缺点是,如果不需要使用标准分析器的标题字段,则最终得到的分析数据比需要的多。由你决定。

 类似资料:
  • 问题内容: 我正在使用ElasticSearch 1.5.2,希望具有以下设置: 我应该在哪里添加它们?我的意思是在创建索引之前还是之后? 通过在线搜索,我发现了一些类似的方法 但是我有2个问题, 我收到编译错误:ImmutableSettings.builder类型的方法loadFromSource不适用于参数XContentBuilder 另外,我不知道如何将我的设置转换为这种格式。在哪里可以

  • 在graphiql中,有一个描述字段,但它总是说“自我描述”。如何向架构添加描述?

  • 问题内容: 有没有一种方法可以将条件附加到值数组中? 例如,如果我的文档如下所示: 我想在其后面附加“ item4”和“ item5”。 我必须在2个查询中这样做吗?一个加载当前值列表,然后更新该列表?还是有一种更优雅的方式让我在一个查询中附加这些项目? 我正在尝试使用Elastic4s做到这一点: 为了使用上面的代码片段,我需要启用groovy脚本,而且我不确定如何对多个项目执行此操作。 任何想

  • 问题内容: 我正在建立搜索,但需要使用不同的分析器分析1个字段。我的问题是,对于一个字段,我需要在其上安装一个分析器以进行词干分析(雪球),然后还需要一个分析器将完整的单词保留为一个标记(关键字)。我可以通过以下索引设置来使其工作: 在标题字段中搜索单个单词时出现问题。如果其中装有“帽子里的猫”,它将存储为“帽子里的猫”,但是如果我搜索猫,我什么也得不到。 这是否有可能实现?还是我需要有2个单独的

  • 问题内容: 索引文件如下: 我想要的是按平台计数和输出统计信息。为了进行计数,我可以将术语聚合作为字段进行计数: 这样,我就可以像预期那样将统计数据作为多个存储桶接收到。 现在,我还能以某种方式添加到这些存储桶中吗(以及用于统计的漂亮输出)?我附带的最好的看起来像: 实际上,它可以工作,并且在每个存储桶中返回非常复杂的结构: 当然,可以从此结构中提取平台的名称和网址(例如),但是是否有更干净,更简

  • 索引文档如下: 我想要的是按平台计数和输出统计信息。对于计数,我可以使用带有的术语聚合作为字段进行计数: 通过这种方式,我以多个bucket的形式接收统计数据,看起来就像预期的那样{key:8,doc\u count:162511}。 现在,我可以以某种方式将和(用于漂亮的统计输出)添加到这些桶中吗?我带来的最好的看起来像: 实际上,它可以工作,并在每个桶中返回非常复杂的结构: 当然,平台的名称和