elasticsearch 索引更改后在elastisearch中重新索引数据

polhcujo  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(108)

我有一个字段carName,它使用一些分析器:

@Field(type = FieldType.Text, searchAnalyzer = "myAnalyzer", analyzer = "myAnalyzer")
private String carName;

myAnalyzer分析器看起来像这样:

{
  "index": {
    "analysis": {
      "filter": {
        "myStopwords": {
          "ignore_case": "true",
          "type": "stop",
          "stopwords": [
            "word1",
            "word2"
          ]
        } 
      },
      "char_filter": {
        "myTrimmer": {
          "flags": "CASE_INSENSITIVE",
          "pattern": "somepatter",
          "replacement": "somrereplacement",
          "type": "pattern_replace"
        } 
      },
      "analyzer": {
        "myAnalyzer": {
          "filter": [
            "lowercase",
            "unique",
            "myStopwords"
          ],
          "char_filter": [
            "myTrimmer"
          ],
          "type": "custom",
          "tokenizer": "whitespace"
        } 
      }
    }
  }
}

现在myStopwords将扩展或收缩。在我的数据库中,我有CAR实体,一旦有人添加新车,它在ES中被索引为文档。当有人更改停用词列表时,我需要做什么?是否可以只在ElasticSearch端刷新数据,甚至不从数据库中阅读它们?或者由于停止词列表中的更改,carName所在的索引中的某些数据可能在索引过程中丢失-例如,停止词列表中的单词?在这种情况下,不幸的是,我需要再次从数据库中读取汽车,并再次索引它们。?
正如我所理解的analyzer和在我的情况下myAnalyzer是在索引过程中使用的ES,那么乍一看,似乎如果我改变停用词列表(所以它这种情况下,它是analyzer的变化),那么我应该重新索引我的汽车的权利,但也许我错了?如果一辆车被命名为“福特金牛王”,而King不在停用词列表中,那么如果我将King添加到停用词列表中会发生什么。如果“King”在停用词列表中,一些文档被索引,现在从列表中删除,那么搜索会发生什么?在这样的Map变化之后,搜索工作正常吗?
我读到了UpdateByQuery方法,我认为它可以用于一些类似的情况,例如更新文档的一部分。但它能在这里使用吗?我的意思是..我怎么能告诉Elasticsearch,如果它是必要的,刷新所有的carName由于停止词列表的变化?

ua4mk5z4

ua4mk5z41#

如果您使用相同的分析器、索引时间和搜索时间,并且您更新了停止词列表,索引时间和搜索时间分析器都将立即使用新的停止词列表,然而,任何已经索引的内容都不会更新,您需要_update_by_query您的索引才能应用新的停止词。
举个简单的例子:
如果索引Ford King Taurus,并且停用词列表不包含King,则将索引以下标记:FordKingTaurus。在搜索时,您可以使用这三个词中的任何一个来查找文档。
然后你在停用词列表中添加King,关闭并重新打开索引以刷新分析器。在这一点上,前一个带有Ford King Taurus的文档将不再可以用King搜索,因为搜索分析器现在忽略了King,即使标记King仍然被索引。您仍然可以使用standard搜索分析器并搜索king来找到文档,因为king标记仍然被索引。
但是,如果索引一个新文档,比如Seat King,那么只有Seat会被索引,搜索King将一无所获。
如果您希望以前的文档选择新的停止词King,则需要重新索引文档,或者使用_update_by_query更新索引,以便源文档根据自身重新索引,但使用索引时间分析器,该分析器具有包含King的新停止词列表
以下是对上述所有解释的快速总结:

# 1. You create your index like normal
PUT test2
{
   "settings": {...},
   "mappings": {...}
}

# 2. You index "Ford King Taurus"
POST test2/_doc/1 
{
  "carName": "Ford King Taurus"
}

# 3. You can find it searching for "king"
POST test2/_search 
{
  "query": {
    "match": {
      "carName": "king"
    }
  }
}

# 4. You close the index, add "king" a new stop words and reopen the index
POST test2/_close
PUT test2/_settings
{
  "index": {
    "analysis": {
      "filter": {
        "myStopwords": {
          "ignore_case": "true",
          "type": "stop",
          "stopwords": [
            "word1",
            "word2",
            "king"
          ]
        }
      },
      "analyzer": {
        "myAnalyzer": {
          "filter": [
            "lowercase",
            "unique",
            "myStopwords"
          ],
          "type": "custom",
          "tokenizer": "whitespace"
        }
      }
    }
  }
}
POST test2/_open

# 5. You cannot find the document searching for "king"
POST test2/_search
{
  "query": {
    "match": {
      "carName": {
        "query": "king"
      }
    }
  }
}
=> No results

# 6. But you can still find it using the standard search analyzer
POST test2/_search
{
  "query": {
    "match": {
      "carName": {
        "query": "king",
        "analyzer": "standard"
      }
    }
  }
}
=> 1 result

# 7. You update your index in place
POST test2/_update_by_query

# 8. None of the search queries will find anything with "king"

相关问题