0

我遇到了一个问题,我需要更新索引上的停用词,该索引将英语分析器指定为默认分析器。通常,分析器在索引的设置中指定:

{
  "twitter": {
    "settings": {
      "index": {
        "creation_date": "1469465586110",
        "analysis": {
          "filter": {
            "lowercaseFilter": {
              "type": "lowercase"
            }
          },
          "analyzer": {
            "default": {
              "type": "english"
            },
...

因此,分析器位于<index name>.settings.index.analysis.analyzer

为了更新分析器,我运行了以下命令:

curl -XPOST "http://localhost:9200/twitter/_close" && \
curl -XPUT "http://localhost:9200/twitter/_settings" -d'
{
    "analysis": {
        "analyzer": {
            "default": {
                "type": "english",
                "stopwords": "_none_"
            }
        }
    }
}' && \
curl -XPOST "http://localhost:9200/twitter/_open"

运行这些命令后,我验证了默认分析器正在分析文本并保留所有停用词。

但是,当我使用 Jest 客户端时,现在设置看起来像这样,并且分析没有正确进行(注意分析设置现在如何位于“members”属性下):

{
  "twitter": {
    "settings": {
      "index": {
        "members": {
          "analysis": {
            "analyzer": {
              "default": {
                "type": "english",
                "stopwords": "_none_"
              },

我已经逐步完成了代码,一切看起来都井井有条: intellij 调试 Jest UpdateSettings 有效负载

4

1 回答 1

0

我想到了。所以通过运行:

sudo tcpflow -p -c -i lo0 port 9200 2>/dev/null | grep -oE '.*(GET|POST|PUT|DELETE) .*_dev.*' -A30

我可以看到我发送的 JsonObject 包含该members字段,这是 GsonJsonObject将对象存储在其内部的位置。由于我将这个原始对象传递给 Jest 的UpdateSettings构建器,它以一种我没想到的方式(包括members字段)被序列化,并以这种方式被发送到 elasticsearch。我通过调用 JsonObject 的toString()方法并将其传递给UpdateSettingsBuilder解决了这个问题

于 2016-08-06T21:25:23.923 回答