gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:48:19 25 4
gpt4 key购买 nike

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

  1. 整个文档
  2. 章节
  3. 段落
  4. 句子

是否可以对文档进行索引,以便您可以根据此要求过滤查询范围?

根据答案进行编辑

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

{
"settings": {
"analysis": {
"analyzer": {
"folding": {
"tokenizer": "standard",
"filter": [ "lowercase", "asciifolding" ]
}
}
}
},
"mappings": {
"books": {
"properties": {
"content": {
"type": "string",
"fields": {
"english": {
"type": "string",
"analyzer": "english"
},
"folded": {
"type": "string",
"analyzer": "folding"
}
}
},
"author": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"language": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"source": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"title": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"fileType": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
},
"sections": {
"_parent": { "type": "books" },
"properties": {
"content": {
"type": "string",
"fields": {
"english": {
"type": "string",
"analyzer": "english"
},
"folded": {
"type": "string",
"analyzer": "folding"
}
}
},
"paragraphs": {
"type": "nested",
"properties": {
"paragraph": {
"properties": {
"page": { "type": "integer" },
"number": { "type": "integer" },
"html_tag": { "type": "string" },
"content": { "type": "string" }

}
}
}
},
"author": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"language": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"source": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"title": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"fileType": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
},
"messages": {
"properties": {
"content": {
"type": "string",
"fields": {
"english": {
"type": "string",
"analyzer": "english"
},
"folded": {
"type": "string",
"analyzer": "folding"
}
}
},
"paragraphs": {
"type": "nested",
"properties": {
"paragraph": {
"properties": {
"page": { "type": "integer" },
"number": { "type": "integer" },
"html_tag": { "type": "string" },
"content": { "type": "string" }

}
}
}
},
"author": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"language": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"source": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"title": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"fileType": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}

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

我现在可以对书籍级别的内容和章节级别的内容执行搜索。这让我可以在段落之间搜索单词。如果我想匹配段落中的两个词,我还可以直接在段落级别进行搜索。

示例:假设我有以下文档

paragraph 1: It is a beautiful warm day.
paragraph 2: The cloud is clear.

我现在可以在内容级别上搜索 beautiful AND cloud 并取回文档。但是,如果我使用嵌套搜索在段落级别搜索 beautiful AND cloud,我不会取回文档,这正是我想要的。

我在这个解决方案中看到的问题是:

  1. 我需要将同一段落编入索引 3 次。一次在段落级别,一次在内容节级别,一次在内容书级别。
  2. 我不明白在书籍和章节之间建立父/子关系对我有什么好处。我还没有找到任何使用突出显示同时搜索两者的方法。
  3. 我需要一个单独的 Message 类型,它与没有父级的 Section 类型完全相同。有没有办法让 child 在没有 parent 的情况下打字,这样我就可以避免额外的打字?

最佳答案

为了实现这一点,您可以为所有句子建立索引,并连同句子的单词一起包含有关封闭上下文的信息,即给定句子在哪个段落、章节和书中。

然后查询术语将返回句子以及有关章节和书籍的信息。有了这些信息,您就知道所指的句子、段落、章节或书籍。

然后您只需使用您感兴趣的任何范围。

要索引的示例文档:

{
"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."
}

第二段:

POST /books/para/2
{
"text": "The cloud is clear."
}

检索文档的查询:

POST /books/_search
{
"query": {
"match": {
"text": {
"query": "beautiful cloud",
"operator": "and"
}
}
}
}

这是否解决了您的问题?

关于elasticsearch - 是否可以使用 elasticsearch 搜索特定范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com