【发布时间】:2019-12-01 23:06:28
【问题描述】:
我有以下问题: 我将书籍存储在弹性数据库中。 将每个单词存储为单独的条目很重要,因为它包含我需要的某些元数据。书籍属于类别,书籍可以属于1个或多个类别,并且是可变属性(书籍-类别关系也保存在MySQL中)。预计书籍数量为数千本。我需要通过一个单词快速搜索所有书籍(例如,有人搜索单词“test”,我需要获取包含该单词以及在哪些页面中的书籍。)。也可以按类别限制搜索。
我的困境是,我是否应该将一本书的单词保存在嵌套字段中,例如
{
"book_name": "book1",
"book_categories": ["cat1", "cat2", ...],
"book_words": [
{
"some_word_meta": "...",
"page": 1
"word_value": "word1"
},
{
"some_word_meta": "...",
"page": 1
"word_value": "word2"
} ... lots of these
]
},
{
"book_name": "book2",
"book_categories": ["cat5", "cat6"],
"book_words": [
{
"some_word_meta": "...",
"page": 1,
"word_value": "wordx"
}, ... lots of these
]
}
在上面的例子中,如果我将一本书从一个类别移动到另一个类别,我只需要在 elastic 中更新 1 条记录。 这种嵌套会影响搜索性能吗?
我也不能在弹性中保存类别信息,并且总是在查询中传递书名(因为 MySQL 知道哪些书属于一个类别),但是我会在搜索查询中得到类似的内容:
book_name in ["book1", "book2", ... thousands more] and word == 'wordx'。在这种情况下,书籍可以展平:
{
"book_name": "book1",
"page": 1,
"word_value": "word1",
"some_word_meta: "..."
},
{
"book_name": "book1",
"page": 1,
"word_value": "word2",
"some_word_meta: "..."
}
数据重复很多,每个单词都明确知道自己属于哪本书,搜索查询看起来很糟糕。
我对 elasticsearch 很陌生,但我仍然没有数据集来尝试它,这些解决方案中哪个似乎更有可能起作用,或者还有其他一些我没有想到的解决方案?
【问题讨论】:
标签: elasticsearch