在Elasticsearch中存储HTML文档

Ama*_*tle 6 html elasticsearch

脚本

我有HTML文档,比方说:电子邮件.我想将这些存储在弹性搜索中并搜索HTML电子邮件的明文.

问题

Elasticsearch也将索引所有HTML标记和属性.我不希望这样.我想搜索span它是否是纯文本,而不是html元素.例如,<span>span</span>可能是一个打击,但不是<span>some other content</span>.

您是否建议在文档中存储HTML剥离字段和HTML字段?或者我应该在S3上存储HTML文档,而是在弹性搜索中留下剥离的HTML版本?它甚至有意义吗?

老实说,如果弹性搜索正在索引HTML文档,我不知道会发生什么,但我可以想象它还将索引div和spans以及所有属性.这些是我完全不寻找的东西.所以:任何解决这个问题的建议都会很棒!

我现在在做什么?

就在我将文档存储在ES中之前,我检查文档类型是否存在索引.如果没有,我创建一个具有给定映射的集合.映射看起来像这样

{
    "analysis": {
        "analyzer": {
            "htmlStripAnalyzer": {
                "type": "custom",
                "tokenizer": "standard",
                "filter": "standard",
                "char_filter": [
                    "html_strip"
                ]
            }
        }
    },
    "mappings": {
        "${type}": {
            "dynamic_templates": [
                {
                    "_metadata": {
                        "path_match": "_metadata.*",
                        "mapping": {
                            "type": "keyword"
                        }
                    }
                }
            ],
            "properties": {
                "_tags": {
                    "type": "nested",
                    "dynamic": true
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

警告:忽略现有映射.这与我的意图无关.他们就在那里.

我要用文档类型替换$ {type} emails. 告诉ES不要将HTML内容编入索引是什么意思?

And*_*fan 7

一个完整的测试用例:

DELETE /test
PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "htmlStripAnalyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["standard","lowercase"],
          "char_filter": [
            "html_strip"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "html": {
          "type": "text",
          "analyzer": "htmlStripAnalyzer"
        }
      }
    }
  }
}

POST /test/test/1
{
  "html": "<td><tr>span<td></tr>"
}
POST /test/test/2
{
  "html": "<span>whatever</span>"
}
POST /test/test/3
{
  "html": "<html> <body> <h1 style=\"font-family: Arial\">Test</h1> <span>More test</span> </body> </html>"
}

POST /test/_search
{
  "query": {
    "match": {
      "html": "span"
    }
  }
}

POST /test/_search
{
  "query": {
    "match": {
      "html": "body"
    }
  }
}

POST /test/_search
{
  "query": {
    "match": {
      "html": "more"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)