【问题标题】:Is there a JSON equivalent of the html_strip filter?是否有 html_strip 过滤器的 JSON 等价物?
【发布时间】:2020-05-08 19:50:06
【问题描述】:

我们从 JSON 格式的应用程序表单中接收数据,并且需要能够对其进行搜索 - 但仅限于用户输入的文本。我们来自其他来源的一些数据以 XML 的形式出现,这很好 - html_strip (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-htmlstrip-charfilter.html) 字符过滤器可以完成这项工作。

但是是否有 JSON 的等价物 - 您将序列化的 JSON 作为文本发送,它会去除标签,只留下数据?

一个非常简单的例子:

申请表发回此数据:

{
  "ed_hist1": "Glasgow High School",
  "ed_hist2": "Edinburgh University"
}

这会被序列化并作为文本字段添加到我们的文档中:

{
  "Type": "applicationform",
  "Id": 1,
  "Name": "Margaret Blenkinsop",
  "Email": "JohnB232@myCompany.COM",
  "Text": "{\"ed_hist1\":\"Glasgow High School\",\"ed_hist2\":\"Edinburgh University\"}"
}

然后发送到 ES。

当我搜索文本字段时,我不想只找到“ed_hist1”或“ed_hist2”“格拉斯哥高中”和“爱丁堡大学”。

或者是预处理 JSON 的唯一方法? (这很好,但如果 ES 会为我处理,我不想手动编写代码。)

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    解决方案 #1

    有几种方法可以实现您想要的。最“惯用”的方法是预处理来自您的应用程序的 JSON,将您拥有的 JSON 文档转换为列表。

    EG:

    {
      "ed_hist1": "Glasgow High School",
      "ed_hist2": "Edinburgh University"
    }
    

    变成

    [
      "Glasgow High School",
      "Edinburgh University"
    ]
    

    然后您的文档将如下所示:

    {
      "Type": "applicationform",
      "Id": 1,
      "Name": "Margaret Blenkinsop",
      "Email": "JohnB232@myCompany.COM",
      "Text": ["Glasgow High School", "Edinburgh University"]
    }
    

    然后,您可以在 Text 字段中搜索您正在寻找的 ed_hist,并返回与您的查询匹配的文档等。这是您的案例最简单的解决方案,但还有其他结构化数据的方法取决于你想问它什么问题。

    解决方案 #2

    您似乎在考虑将原始 JSON 文档作为文本保留在字段中作为另一个文档的一部分。没有额外的上下文,我不是特别喜欢这个解决方案,但我认为你有你的理由。对于第二个不推荐的用例,除了storeing 您的原始字段值之外,我还会使用字符过滤器。该过程如下所示:

    index document
    original documented `store`d
    custom char filter strips out the unwanted JSON language characters
    text indexed
    

    在查询时,您可以取回原始存储值,还可以在去除字符后对 JSON 文档中包含的文本进行“全文”搜索。我真的相信,如果您使用解决方案 #1 变体,您可以从数据中获得更多收益。为文本搜索去除 HTML 是搜索标记文档的好主意,但去除 JSON 的意义不大,因为 JSON 是 ES 的生计,并且会为您提供更多工具来作为 JSON 使用。

    编辑:我忘记链接到store 文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html

    编辑 #2:另外需要注意的是默认启用的 _source 字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html 您的原始 JSON 文档也免费保存在那里。这可以让您恢复发送给 ES 的原始文档,同时仍为您提供数据库中更惯用的数据结构。

    【讨论】:

    • 您好伊恩,非常感谢您的回复。我必须承认我没有想到选项 1,你说得对——它看起来好多了。我们的解决方案已经运行了好几个月,并且已经真正“安定下来”——我们很少遇到问题,所以每个人(包括我在内)都不愿意改变后端和前端之间的接口以适应一个数组而不是单个文本字段。事后诸葛亮....我对 char 过滤器的想法很感兴趣,但是设置一个 char 过滤器会不会太复杂?它会是什么样子?再次感谢您的宝贵时间。
    • elastic.co/guide/en/elasticsearch/reference/current/… 您的字符过滤器可以是一个简单的映射过滤器,您只需将每个 JSON 语言标记替换为什么都没有,而且你有一些经过净化的文本。您可以使用_analyze 端点测试您的过滤器,就像那里的文档一样。祝你好运!
    猜你喜欢
    • 2019-12-02
    • 2020-10-19
    • 2021-03-29
    • 2011-01-16
    • 2020-09-20
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多