gpt4 book ai didi

indexing - 单个字段的 Elasticsearch 多个分析器

转载 作者:行者123 更新时间:2023-11-29 02:45:50 26 4
gpt4 key购买 nike

我将不同类型的文档存储在具有严格预定义映射的单个索引中。它们都有一些字段(例如,“正文”),但我希望在索引时对它们进行稍微不同的分析(例如,对特定文档使用不同的标记过滤器)并在搜索时以相同的方式处理。据我所知,无法为每个文档指定分析器。

我还考虑使用:

  1. 对象字段具有针对文档类型进行不同分析的子字段,因此每个文档只有一个填充的子字段(例如“body.mail”、“body.html”)。问题是我无法搜索整个“正文”字段,它会查看其所有子字段(以免破坏现有应用程序)。
  2. 多字段的新轮回(具有带有通用分析器的“正文”字段,并在其中自定义分析“邮件”、“html”等)。 Hovewer,我不确定是否可以在索引时直接使用它们并在搜索时间接使用它们(例如,使用 {"mail":"smth"} 保存对象以使用特定的索引分析器,然后通过 "query":{"body":"smth"} 搜索以使用通用搜索分析器)。
  3. 要将“body”分成多个具有不同映射的字段,请将它们从_all 中删除,并将copy_to 设置为单个body 字段。我不确定,但由于复制,它会增加大量索引开销。

最佳答案

正如我在评论中提到的,你想要的是不可能的。一句话,您的要求是:以多种方式分析相同的数据,但作为单个字段进行搜索,因为这会破坏现有的应用程序。

             -- body.html          
-- body.email
body field ---- body.content --- all searched as "body"
...
-- body.destination
-- body.whatever
  • 您的第一个选择是多字段,它牢记这个确切的目的:以多种方式分析相同的数据。问题是您无法搜索 "body"并期望 ES 搜索 body.html , body.email ... 即使这是可能的,您也希望使用不同的分析器进行搜索。再次,不可能。此选项要求您更改应用程序并搜索 multi_match 中的每个字段或者在 query_string .

  • 您的第二个选择 - reincarnation of multi-fields - 将再次不起作用,因为您无法引用 body和 ES,在后台匹配 mail , content

  • 第三个选项 - 使用 copy_to - 将不起作用,因为复制到另一个字段“X”意味着索引被复制的数据将使用 X 进行分析的分析器,这打破了您对相同数据进行不同分析的要求。

  • 可能还有第四个选项 - "path": "just_name" from multi_fields - 乍一看应该有效。意思是,您可以有 3 个多字段(电子邮件、内容、html),这三个字段都有一个 body。子领域。有"path": "just_name"允许您只搜索 body即使body是多个其他字段的子字段。但这是不可能的,因为这种类型的多字段 不会接受相同的 body 的不同分析器。 .

无论哪种方式,您都需要更改要求中的某些内容,因为它们不会按照您希望的方式工作。


话虽如此,我很想知道您在应用程序中使用了哪些查询。这将是一个简单的更改(是的,您需要更改您的应用)查询 body查询字段 body.*multi_match .

我为您提供了另一种解决方案:创建多个索引,为您的 body 的每个分析器创建一个索引。 .例如,对于 mail , contenthtml您定义了三个索引:

PUT /multi_fields1
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "whitespace",
"search_analyzer": "standard"
}
}
}
}
}
PUT /multi_fields2
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "standard",
"search_analyzer": "standard"
}
}
}
}
}
PUT /multi_fields3
{
"mappings": {
"test": {
"properties": {
"body": {
"type": "string",
"index_analyzer": "keyword",
"search_analyzer": "standard"
}
}
}
}
}

你看到他们都有相同的type和相同的字段名称 - body - 但不同 index_analyzer秒。然后你定义一个别名:

POST _aliases
{
"actions": [
{"add": {
"index": "multi_fields1",
"alias": "multi"}},
{"add": {
"index": "multi_fields2",
"alias": "multi"}},
{"add": {
"index": "multi_fields3",
"alias": "multi"}}
]
}

将别名命名为与当前索引相同的名称。应用程序不需要更改,它将使用相同的名称进行索引搜索,此名称不会指向索引,而是指向一个别名,该别名又引用您的多个索引。需要改变的是如何索引文档,因为 html文件需要进入multi_fields1索引例如 email文档需要在 multi_fields2 中建立索引索引等

无论您找到/选择什么解决方案,您的需求都需要改变,因为您想要的方式是不可能的。

关于indexing - 单个字段的 Elasticsearch 多个分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30943160/

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