场景
我有一些HTML文档,比如说邮件。我想把这些邮件存储在Elasticsearch上,并且搜索HTML邮件中的普通文本。
问题
Elasticsearch将索引所有的HTML标签和属性,但我不想要这些。我想要搜索的是纯文本中的span
,而不是HTML元素。例如<span>span</span>
可以被匹配到,但是<span>其他内容</span>
不能匹配到。
问题
你会推荐在文档中存储一个已经去除HTML标签的字段和一个HTML字段吗?还是应该将HTML文档存储在S3上,而在Elasticsearch中只存储一个去除HTML标签的版本?这样做是否有意义?
我并不知道如果Elasticsearch索引HTML文档会发生什么,但我可以想象它也会索引
和以及所有属性。这些都是我完全不需要搜索的东西。因此:任何解决这个问题的建议都将是极好的!
现在我正在做什么?
现在,在将文档存储在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
}
}
}
}
}
警告:忽略现有的映射。它与我的意图无关。它们只是存在。
我将使用文档类型替换${type},比如emails
。
如果要告诉ES不要索引HTML内容,该怎么做呢?
dynamic
应该设置为false(或strict),并且您必须明确提供要在文档中索引的内容。这意味着您将需要解析HTML,然后构建一个JSON查询(自己或通过ES API),仅向ES提供相关部分。如果您感兴趣,我可以写一个小例子。 - Adonis"properties":{"_tags":{"type":"nested","dynamic":true},"html":{"type":"text","analyzer":"htmlStripAnalyzer"}}
,就可以了。 - Andrei Stefan