我需要根据以下范围对文档执行文本搜索:
是否可以索引文档以便我可以根据此要求过滤查询范围?
根据答案进行修改
我现在已经创建了以下索引
execution plan
这给了我以下类型:书籍,章节(父书)和消息。 Sections和Messages有嵌套类型Paragraphs,我跳过了句子级别。
我现在可以对图书级别的内容,部分级别的内容执行搜索。这允许我在段落之间搜索单词。如果我想匹配段落中的两个单词,我也可以直接在段落级别上搜索。
示例:假设我有以下文档
view
我现在可以在内容级别搜索漂亮的AND云并获取文档。但是,如果我使用嵌套搜索在段落级别搜索漂亮的AND云,我就不会收回文档。这就是我想要的。
我看到的问题是这个解决方案的宽度:
答案 0 :(得分:4)
为了达到这个目的,你可以索引所有句子,并连同句子的单词,你包括有关封闭语境的信息,即在哪个段落,章节和书籍是给定的句子。
然后查询术语将返回句子以及有关章和书的信息。有了这些信息,您就知道哪个句子,段落,章节或书籍。
然后你只需使用你感兴趣的任何范围。
索引的示例文档:
{
"book": <book-id>,
"chapter": <chapter-id>,
"paragraph": <paragraph-id>,
"sentence": <sentence-id>,
"sentence_text": "Here comes the text from a sentence in the indexed book"
}
问题澄清后的补充答案
要实现此目的,您可以使用存储在同一索引中的不同文档类型。然后你可以使用一个查询,它将返回可能不同类型的文档(段落,书籍等)。然后通过过滤结果类型,您可以得到您想要的结果。这是一个例子:
整本书:
POST /books/book/1
{
"text": "It is a beautiful warm day. The cloud is clear."
}
第1段:
POST /books/para/1
{
"text": "It is a beautiful warm day."
}
第2段:
POST /books/para/2
{
"text": "The cloud is clear."
}
查询检索文档:
POST /books/_search
{
"query": {
"match": {
"text": {
"query": "beautiful cloud",
"operator": "and"
}
}
}
}
这会解决您的问题吗?
答案 1 :(得分:1)
另一种选择是拥有单个文档/书籍但内部有许多nested documents,这样他们就可以在根级别共享相同的“书籍”上下文。如果您有一个级别的层次结构(所有句子作为嵌套文档)或更多(capter =&gt; paragrap =&gt;句子),则由您决定。单个级别可以使查询更容易编写。
{
"book": 123,
"author": "Harry",
"written": 1995,
"sentences": [
{
"chapter": 1,
"paragraph": 2,
"sentence": 3,
"text": "abc def"
},
{
"chapter": 2,
"paragraph": 3,
"sentence": 4,
"text": "ghi jkl"
},
{ ... }
]
}