是否可以使用elasticsearch搜索特定范围?

时间:2016-01-01 13:37:04

标签: elasticsearch

我需要根据以下范围对文档执行文本搜索:

  1. 整个文件
  2. 章节
  3. 是否可以索引文档以便我可以根据此要求过滤查询范围?

    根据答案进行修改

    我现在已经创建了以下索引

    execution plan

    这给了我以下类型:书籍,章节(父书)和消息。 Sections和Messages有嵌套类型Paragraphs,我跳过了句子级别。

    我现在可以对图书级别的内容,部分级别的内容执行搜索。这允许我在段落之间搜索单词。如果我想匹配段落中的两个单词,我也可以直接在段落级别上搜索。

    示例:假设我有以下文档

    view

    我现在可以在内容级别搜索漂亮的AND云并获取文档。但是,如果我使用嵌套搜索在段落级别搜索漂亮的AND云,我就不会收回文档。这就是我想要的。

    我看到的问题是这个解决方案的宽度:

    1. 我需要将同一段落索引3次。一旦进入段落级别,一次进入内容部分级别,一次进入内容级别。
    2. 我不明白我在书籍和章节之间建立父/子关系会带来什么好处。我还没有找到任何方法同时使用突出显示来搜索。
    3. 我需要一个单独的Message类型,它与没有parent的Section类型完全相同。没有父母的孩子没有办法,所以我可以避免额外的类型吗?

2 个答案:

答案 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"
        },
        { ... }
    ]
}