我正在创建一个查找索引,该索引将仅用作terms filter。因此,无需搜索/汇总,只需过滤和GET
即可。
我正在讨论此查找索引的结构,是否每个文档都应包含我要过滤的所有字段,或者是否应为每个字段创建索引。
例如,假设每个文档都与一个用户有关。每个用户都有他们玩过的游戏,看过的书和看过的电影的列表。在搜索游戏/书籍/电影推荐时,我将使用过滤器一词来过滤掉他们已经与之互动的那些物品。
我想知道是否应该有一个包含文档映射的查找索引:users_index
{
'game_ids': [],
'movie_ids' : [],
'book_ids': []
}
或每个查询值一个索引,例如:
user_games_index
{
'game_ids': []
}
user_movies_index
{
'movie_ids': []
}
user_books_index
{
'book_ids': []
}
优点之一:
多个索引的优点:
我应该注意,如果使用多个索引,则只能是4或5,每个索引大约有50万个文档。另外,每个索引只有1个主分片,没有副本,而且我在单个m5.2xlarge EC2实例(8个核,32G ram)上。
这些统计数据是如此之小,以至于目前它真的不重要吗?还是我应该赞成一个或多个指数?
最佳答案
第三种选择怎么样?
您有一个索引,索引中的每个文档看起来都像这样:
{
"user_id" : "some_user",
"document_type" : "movie" or "game" or "book"
"document_id" : "id of movie, game or book"
}
为什么?由于您说用户的游戏,电影或书籍会经常更新,因此这种方法使您可以轻松地为用户添加/删除单个电影,游戏或书籍。
您还可以轻松过滤特定用户的书籍/电影/游戏。
所有值的类型均为“关键字”,并且过滤应快速。
PS:ES索引的“良好”映射将尝试最大程度地减少单个文档的更新次数,而是在插入/删除文档的级别上工作,因为ES与查找和更新文档相比可以很好地完成此任务。
编辑:我添加了查询示例,以说明如何使用 bool(boolean) 查询过滤出结果。
例:
GET _搜索
{
"query": {
"bool": {
"must_not":{
"term" : {
"user_id" : "user X"
}
}
}
}
}
GET _搜索
{
"query": {
"bool": {
"must_not":{
"term" : {
"user_id" : "user X"
}
},
"filter":{
"term" : {
"document_type" : "movie"
}
}
}
}
}
关于elasticsearch - 一个大的Elasticsearch查找索引,还是几个小的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56307993/