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