Elasticsearch 单个字段的多个分析器

2024-05-08

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

我还考虑使用:

  1. 对象字段具有针对文档类型进行不同分析的子字段,因此每个文档只有一个填充的子字段(例如“body.mail”、“body.html”)。问题是我无法搜索整个“正文”字段,该字段将查看其所有子字段(以免破坏现有应用程序)。
  2. 多字段的新转世(具有带有通用分析器的“body”字段,并在其中自定义分析“mail”、“html”等)。然而,我不确定是否可以在索引时直接使用它们并在搜索时间接使用它们(例如,用{"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...即使这是可能的,您也希望使用不同的分析器进行搜索。再说一次,不可能。此选项要求您更改应用程序并搜索 a 中的每个字段multi_match或在一个query_string.

  • 你的第二个选择 -reincarnation of multi-fields- 将再次不起作用,因为你不能参考body和 ES,在后台,以匹配mail, content etc.

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

  • 可能还有第四种选择——"path": "just_name" from multi_fields https://www.elastic.co/guide/en/elasticsearch/reference/0.90/mapping-multi-field-type.html#_accessing_fields- 乍一看应该有效。这意味着,您可以拥有 3 个多字段(电子邮件、内容、html),这三个字段都有一个body子领域。拥有"path": "just_name"允许您只搜索body即使body是多个其他字段的子字段。但这是不可能的,因为这种类型的多字段不会接受同一分析仪的不同分析仪body.

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


话虽这么说,我很好奇您在应用程序中使用了哪些查询。这将是一个简单的改变(是的,您需要更改您的应用程序)从查询body查询字段body.* in a multi_match.

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

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_analyzers。然后定义一个别名:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 单个字段的多个分析器 的相关文章

随机推荐

  • 无法解析类型“Microsoft.AspNetCore.Identity.RoleManager”的服务

    我编写代码以在我的 asp net core 项目中向用户添加角色 这是我的角色控制器 public class RolesController Controller RoleManager
  • 如何编写对 UTF-8 安全的代码?

    我们有一组针对 ASCII 字符集开发的应用程序 现在 我们正尝试在冰岛安装它 但遇到了冰岛字符被搞砸的问题 我们正在解决我们的问题 但我想知道 是否有一个好的 指南 来编写专为 8 位字符设计的 C 代码 并且在提供 UTF 8 数据时可
  • UIWebView 是否在请求标头中发送与移动 Safari 相同的用户代理?

    抱歉 我只想自己测试一下 但我目前没有 Mac UIWebView 内部发出的 Web 请求是否发送与移动 Safari 发出的 Web 请求相同的用户代理信息 从 UIWebView 发出的 Web 请求不会在用户代理字符串中包含单词 S
  • M2crypto签名“算法”

    这两个代码提供了相同的签名 这是预期的 code1 from M2Crypto import RSA EVP import base64 hashlib text some text pkey EVP load key mykey pem
  • 显示视频的缩略图

    大家好 在我的应用程序中 用户将复制 YouTube 的视频链接并将其粘贴到文本框中 一旦他单击添加按钮 我就必须显示视频的缩略图 如何从 YouTube 页面呈现视频缩略图 我在前端使用Jquery和HTML5 获取 YouTube 缩略
  • 如何执行一批相互依赖的 AFNetworking 请求

    我需要执行一系列按顺序运行的服务器调用 并且只有在所有先前的请求都成功的情况下才能执行一个请求 所以 我的想法是创建一个AFHTTPRequestOperation对于每个请求和使用 myAFHTTPClient enqueueBatchO
  • CSS中.container.\31 25\25是什么意思?

    在下面的代码中 我想知道什么 反斜杠可能意味着什么 我在学习的课程中没有遇到过反斜杠字符 我相信这段代码是用来识别浏览器大小的 container 31 25 25 width 100 max width 1500px max width
  • 将选择菜单连接到单个表单输入中

    我有一个文本输入如下
  • FF / Chrome 支持的 XMLHttpRequest.DONE 值存在问题

    我有一段 Javascript 需要调试 var httpRequest new XMLHttpRequest httpRequest onreadystatechange function if this readyState XMLHt
  • 没有列名列表的tsql标识插入

    我要将一些数据从一个数据库转储到另一个数据库 我在用 set identity insert MyTable on GO INSERT INTO MyTable SELECT FROM sourceDB dbo MyTable GO set
  • 用整数矩阵对 data.frame 进行子集化

    我一直遇到这个问题 想知道是否有一个简单的解决方法 对于某些情况 我发现考虑将矩阵子集化更合乎逻辑 N lt 12 N NA lt 6 dat lt data frame V1 runif N V2 runif N sel mat lt m
  • C# Random 类的问题

    我有一个代表一枚硬币的类 可以使用 Coin Flip 方法翻转它 Flip 使用 random Next 2 得到代表正面或反面的 0 或 1 这很好用 有点 对于该程序 我需要有 2 个我制作的硬币 比如说 coin1 和 coin2
  • 在 Docker 中运行 Keycloak 时出错

    我试图在 Docker 中运行 Keycloak 但它抛出一个错误 这是泊坞窗文件 FROM jboss keycloak 4 1 0 Final WORKDIR opt jboss keycloak COPY realm export j
  • sklearn pipeline + keras顺序模型-如何获取历史记录?

    Keras https keras io模型 当 fit被调用时 返回一个历史对象 如果我将此模型用作 sklearn 管道的一步 是否可以检索它 顺便说一句 我正在使用 python 3 6 提前致谢 History 回调记录每个时期的训
  • OSX 上的 XAMPP 默认文件夹

    入门手册说我可以将文件放入 Applications XAMPP htdocs 文件夹和 Sites 文件夹中 但是当我将文件放入 Sites 文件夹中时 它会出现以下错误 Server error The server encounter
  • WPF 自定义控件不可见

    当我在 WPF 中创建自定义控件并将其添加到窗口时 我在对话框中看不到任何放置它的内容 这就是我正在做的 创建一个新的 WPF 应用程序 添加 gt 新项目 gt 自定义控件 WPF CustomButton cs 我将 CustomBut
  • 超出 CreateConstantBufferView 处虚拟地址的末尾

    我正在遵循 使用 DirectX12 进行游戏编程 ch 6 代码 但在 ID3DDevice CreateConstantBufferView 中 我发现 D3D12 错误 D3D12 错误 ID3D12Device CreateCons
  • 如何在 TextField (SwiftUI) 上添加底线

    I use Rectangle 在 TextField SwiftUI 上添加底部边框 但我想用protocol TextFieldStyle对于 TextField 样式的底线 如 RoundedBorderTextFieldStyle
  • 如何让枚举存储每个条目的额外信息

    我有一组包含相关信息的项目 这些项目是由我 程序员 定义的 用户不需要更改它们 它们永远不需要根据配置进行更改 并且它们唯一可能更改的时间是在我的应用程序的未来版本中 我事先知道这些项目应该有多少 以及它们的确切数据是什么 枚举是一种很棒的
  • Elasticsearch 单个字段的多个分析器

    我使用严格的预定义映射将不同类型的文档存储在单个索引中 它们都有一些字段 例如 body 但我希望在索引时对它们进行稍微不同的分析 例如 对特定文档使用不同的标记过滤器 并在搜索时以相同的方式处理 据我所知 分析器不能按文档指定 我还考虑使