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

Elasticsearch:无法将参数[分析器]从[默认值]更新为[自动完成]

端木澄邈
2023-03-14

所以伙计们,我开始研究elasticsearch,并开始尝试在我的机器上构建一个带有edge-ngram标记器的自动完成,并在尝试遵循此类配置的留档时发现了一个问题。

我遵循了以下步骤:

>

  • 根据文档要求,我使用标准配置创建了索引:

     {
        "settings": {
           "analysis": {
              "analyzer": {
                 "autocomplete": {
                    "tokenizer": "autocomplete",
                      "filter": [
                        "lowercase"
                      ]
                  },
                  "autocomplete_search": {
                     "tokenizer": "lowercase"
                  }
               },
               "tokenizer": {
                  "autocomplete": {
                     "type": "edge_ngram",
                     "min_gram": 2,
                     "max_gram": 10,
                     "token_chars": [
                        "letter"
                     ]
                  }
               }
            }
         }
     }
    

    我通过批量向索引中添加了一项:

     {"index":{"_index":"products","_type":"products"}}{"sku":"73792589","name":"Bruno's test","img":"73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg","avaliacao":0,"preco_de":159,"preco_por":143.1}
    

    我试图更新字段映射以引用我的自定义分析仪

    问题:当尝试继续执行步骤3时,以下错误返回给我:

    [REQUEST] _mapping
    {
      "properties": {
        "name": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search",
          "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }  
          }
        },
        "sku": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search",
          "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }  
          }
        }
      }
    }
    
    [RESPONSE]
    {
      "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "Mapper for [name] conflicts with existing mapper:\n\tCannot update parameter [analyzer] from [default] to [autocomplete]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "Mapper for [name] conflicts with existing mapper:\n\tCannot update parameter [analyzer] from [default] to [autocomplete]"
      },
      "status": 400
    }
    
  • 共有1个答案

    聂炜
    2023-03-14

    为产品索引添加设置后,您对数据进行了索引,但没有定义任何显式映射。因此,生成了动态映射。

    索引的映射是

    {
      "products": {
        "mappings": {
          "properties": {
            "avaliacao": {
              "type": "long"
            },
            "img": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "name": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "preco_de": {
              "type": "long"
            },
            "preco_por": {
              "type": "float"
            },
            "sku": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        }
      }
    }
    

    现在,您正在尝试更新索引的映射(在第3步中)。您希望将analyzer参数与字段一起添加,但这无法完成。这是因为在更新索引映射时,您可以-

    1. 向现有对象字段添加新属性
    2. 将多字段添加到现有字段
    3. 更改现有字段的映射
    4. 重命名一个字段

    要了解有关更新映射API的更多信息,请参阅此留档

    (您需要首先删除产品索引)按照以下步骤索引批量数据(使用适当的索引映射)

    1.第一步:索引映射

    {
      "settings": {
        "analysis": {
          "analyzer": {
            "autocomplete": {
              "tokenizer": "autocomplete",
              "filter": [
                "lowercase"
              ]
            },
            "autocomplete_search": {
              "tokenizer": "lowercase"
            }
          },
          "tokenizer": {
            "autocomplete": {
              "type": "edge_ngram",
              "min_gram": 2,
              "max_gram": 10,
              "token_chars": [
                "letter"
              ]
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "name": {
            "type": "text",
            "analyzer": "autocomplete",
            "search_analyzer": "autocomplete_search",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "sku": {
            "type": "text",
            "analyzer": "autocomplete",
            "search_analyzer": "autocomplete_search",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
    

    第二步:索引批量数据

    POST/ _bulk
    
    {"index":{"_index":"products","_type":"products"}}
    {"sku":"73792589","name":"Bruno's test","img":"73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg,73792589_5911_20201229172349.jpg","avaliacao":0,"preco_de":159,"preco_por":143.1}
    
     类似资料:
    • 问题内容: 我有来自Logstash的数据,这些数据正在以过度的方式进行分析。从本质上讲,该领域将被分解成, 和。我知道我可以更改现有数据的映射和重新索引,但是如何更改默认分析器(在ElasticSearch或LogStash中)以避免将来的数据出现此问题? 具体解决方案:在我第一次将数据发送到新集群之前,我为该类型创建了一个映射。 IRC解决方案:创建索引模板 问题答案: 如您所知,当未明确指定

    • 问题内容: 我在Elasticsearch上遇到问题,我不希望对索引项进行分析。但是elasticsearch有一些默认设置,可以在空间上标记它。因此,我的方面查询未返回我想要的结果。 我读到索引类型的属性应该工作。但是问题是我事先不知道我的文档结构。我会在不知道表结构的情况下将随机MySQL数据库索引到elasticsearch。 我如何设置elasticsearch,使其默认情况下会一直使用,

    • 本文向大家介绍JS函数多个参数默认值指定方法分析,包括了JS函数多个参数默认值指定方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS函数多个参数默认值指定方法。分享给大家供大家参考,具体如下: 函数有一个参数时,以往这样定义(参数为p1): 当需要为p1设定一个默认值时 当函数需要2个参数时,以前习惯这样写 后来发现完全不需要这样写,js函数甚至不需要在括弧内预设参数名,可以用一

    • 问题内容: 我想在一个类中构建一个方法,并从该类中获取默认值参数。通常,我会对某些数据进行过滤。在我的班级内部,我有一个方法,通常我会传递数据向量。有时我没有矢量,而是获取了模拟数据。每次我不传递特定向量时,我都希望默认情况下获取模拟数据。我认为在我说的方法定义中应该很容易构造。但是由于某种原因,我有一个错误。简化的结构是: 我期望的输出应该是: 我尝试了默认分配,因为它显然无法正常工作。据我了解

    • 问题内容: 在我的系统中,数据插入始终是通过logstash通过csv文件完成的。我从未预定义映射。但每当我输入它总是被一个字符串是,其结果就像一个条目被分为,,,。无论如何,我是否可以更改elasticsearch的默认/动态映射,以便所有字符串(无论索引如何,无论类型如何)都被视为?还是有一种在文件中设置它的方法?说我的档案看起来像 我希望所有的字符串都是这样,我也不介意将其作为所有将来的数据

    • 问题内容: 是否可以将现有字段的属性从修改为? 如果没有,我该怎么办才能将我所有的文件保存起来? 我无法删除映射(因为所有文档都将消失),并且需要该旧字段进行分析。 问题答案: 不能修改现有字段,但是,您可以创建其他字段或子字段添加到您的领域。 我要使用后一种解决方案。因此,首先,将一个新的子字段添加到您现有的字段中,如下所示: 上面,我们已经添加了子场称为(被分析)现有的(这是) 接下来,我们需