我有以下问题:
我正在将书籍存储在 flex 数据库中。 每个单词都应存储为单独的条目,这一点很重要,因为它包含我需要的某些元数据。书籍属于类别,书籍可以属于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
]
}
在上面的示例中,如果我将一本书从一个类别移动到另一个类别,则只需要更新 flex 记录中的1条记录。 这种嵌套会影响搜索性能吗?
我也无法以 flex 方式保存类别信息,并且始终在查询中传递书籍名称(因为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还是很陌生,但是我仍然没有数据集可以尝试使用这些解决方案中的哪一个似乎更可行,或者还有我没有想到的其他解决方案?
最佳答案
我的建议是拥有多个索引,并在应用程序侧进行少量操作。
指数:书籍和单词
Books
{
"name" :
"other_attributes"
}
Words
[
{
"metadata": ...
"word": word1,
"categories": ["thriller"],
"book": ["book1_page1", "book1_page2"]
},
{
"metadata": ...,
"word": word1,
"categories": ["romance"],
"book": ["book9_page31"]
}
]
当您说出所有带有“概念”字样的书时,
GET words/_search
{
"query": {
"term": {
"word": {
"value": "Concepts"
}
}
}
}
对于类别搜索,
GET words/_search
{
"query": {
"term": {
"categories": {
"value": "Thriller"
}
}
}
}
要获得所有带有页码和元数据的书,该书的字词为“概念”,属于“浪漫”类型,
GET words/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"FIELD": {
"value": "concept"
}
}
},
{
"term": {
"category": {
"value": "romance"
}
}
}
]
}
}
}
注意:您也可以查询多个索引。
关于elasticsearch - Elasticsearch嵌套数据搜索性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130832/