在 Elasticsearch 中更改设置的最佳解决方案
Best solution for changing settings in Elasticsearch
我有 2 question
已编入索引:FIRE_DETECTED
和 SMOKE:DETECTED
在 Elasticsearch
目标
我想用 query = 'fire'
搜索 -> 结果:FIRE_DETECTED
query = 'dectected'
-> 结果:FIRE_DETECTED
和 SMOKE:DETECTED
一些解决方案
- 在分析器中添加更多设置
- 我们需要使用新设置创建新索引(添加令牌过滤器:
word_delimiter_graph
)
- 重建索引
- 问题:如何在不影响客户的情况下在生产中添加设置?
- 在 Elasticsearch 中再添加 1 个字段
filterd_question
- 使用
:
和 _
拆分数据
- 在此
filterd_question
字段中保存拆分数据
- 问题:我们还需要 1 个字段
最好的解决方案是什么? (如果需要,添加更多解决方案)
同样,在使用 elasticsearch 时,这确实是一个非常好的且非常常见的场景,并且随着需求不断变化,为了支持它们,我们必须改变我们在 ES 中索引数据的方式。
你提到的这两种方法都有公司使用,它们都有自己的trad-offs,你必须根据你的要求选择一种适合你的方法。
Change/add 分析器需要执行以下步骤才能正常工作:
- 关闭索引
- Add/Edit 分析器定义。
- 打开索引
- 重新索引所有文档(您应该使用 index alias with zero down time 来有效地做到这一点并将对 end-users 的影响降到最低)
- 在第 4 步之后,您的新搜索将起作用。
优点:它不会创建新字段,因此可以节省 space,从而更有效、更简洁地进行此更改。
缺点是 re-index 可能会花费很多时间,具体取决于文档的数量及其相对复杂的过程。
添加一个custom-analyzer然后使用新添加的分析器添加一个新字段
在这种情况下,它也需要 closing/opening 索引,除非您使用的是内置分析器,但在这种情况下,您的新文档或正在更新的文档将具有新字段,因此您的搜索根据新 analyzer/logic 会带来部分结果,但根据您的 use-case.
这可能没问题
优点:方法相对简单,在所有情况下都不需要 full-re 索引。
缺点:额外的 space,如果未使用旧字段并且复杂性根据 use-cases 变化。
如果你不想change/add分析器。您可以尝试使用通配符查询。虽然缺点是性能。
我有 2 question
已编入索引:FIRE_DETECTED
和 SMOKE:DETECTED
在 Elasticsearch
目标
我想用 query = 'fire'
搜索 -> 结果:FIRE_DETECTED
query = 'dectected'
-> 结果:FIRE_DETECTED
和 SMOKE:DETECTED
一些解决方案
- 在分析器中添加更多设置
- 我们需要使用新设置创建新索引(添加令牌过滤器:
word_delimiter_graph
) - 重建索引
- 问题:如何在不影响客户的情况下在生产中添加设置?
- 在 Elasticsearch 中再添加 1 个字段
filterd_question
- 使用
:
和_
拆分数据
- 在此
filterd_question
字段中保存拆分数据 - 问题:我们还需要 1 个字段
最好的解决方案是什么? (如果需要,添加更多解决方案)
同样,在使用 elasticsearch 时,这确实是一个非常好的且非常常见的场景,并且随着需求不断变化,为了支持它们,我们必须改变我们在 ES 中索引数据的方式。
你提到的这两种方法都有公司使用,它们都有自己的trad-offs,你必须根据你的要求选择一种适合你的方法。
Change/add 分析器需要执行以下步骤才能正常工作:
- 关闭索引
- Add/Edit 分析器定义。
- 打开索引
- 重新索引所有文档(您应该使用 index alias with zero down time 来有效地做到这一点并将对 end-users 的影响降到最低)
- 在第 4 步之后,您的新搜索将起作用。
优点:它不会创建新字段,因此可以节省 space,从而更有效、更简洁地进行此更改。
缺点是 re-index 可能会花费很多时间,具体取决于文档的数量及其相对复杂的过程。
添加一个custom-analyzer然后使用新添加的分析器添加一个新字段
在这种情况下,它也需要 closing/opening 索引,除非您使用的是内置分析器,但在这种情况下,您的新文档或正在更新的文档将具有新字段,因此您的搜索根据新 analyzer/logic 会带来部分结果,但根据您的 use-case.
这可能没问题优点:方法相对简单,在所有情况下都不需要 full-re 索引。
缺点:额外的 space,如果未使用旧字段并且复杂性根据 use-cases 变化。
如果你不想change/add分析器。您可以尝试使用通配符查询。虽然缺点是性能。