【发布时间】:2016-09-18 00:38:18
【问题描述】:
鉴于我已经在我的自定义分析器中指定了我的 html 条形字符过滤器
当我索引包含 html 内容的文档时
那么我希望将 html 从索引内容中剥离出来
并且在从索引中检索返回的文档时不应包含 hmtl
实际: 索引文档包含 html 检索到的文档包含 html
我已经尝试将分析器指定为 index_analyzer,正如人们所期望的那样,以及其他一些出于绝望的 search_analyzer 和分析器。似乎对被索引或检索的文档没有任何影响。
针对 HTML_Strip 分析字段测试文档索引:
请求:带有 html 内容的示例 POST 文档
POST /html_poc_v2/html_poc_type/02
{
"description": "Description <p>Some déjà vu <a href=\"http://somedomain.com>\">website</a>",
"title": "Title <p>Some déjà vu <a href=\"http://somedomain.com>\">website</a>",
"body": "Body <p>Some déjà vu <a href=\"http://somedomain.com>\">website</a>"
}
预期 : 已通过 html 分析器解析的索引数据。 实际:数据是用html索引的
回复
{
"_index": "html_poc_v2", "_type": "html_poc_type", "_id": "02", ...
"_source": {
"description": "Description <p>Some déjà vu <a href=\"http://somedomain.com>\">website</a>",
"title": "Title <p>Some déjà vu <a href=\"http://somedomain.com>\">website</a>",
"body": "Body <p>Some déjà vu <a href=\"http://somedomain.com>\">website</a>"
}
}
设置和文档映射
PUT /html_poc_v2
{
"settings": {
"analysis": {
"analyzer": {
"my_html_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
]
}
}
},
"mappings": {
"html_poc_type": {
"properties": {
"body": {
"type": "string",
"analyzer": "my_html_analyzer"
},
"description": {
"type": "string",
"analyzer": "my_html_analyzer"
},
"title": {
"type": "string",
"search_analyser": "my_html_analyzer"
},
"urlTitle": {
"type": "string"
}
}
}
}
}
}
测试以证明自定义分析器完美运行:
请求
GET /html_poc_v2/_analyze?analyzer=my_html_analyzer
{<p>Some déjà vu <a href="http://somedomain.com>">website</a>}
回应
{
"tokens": [
{
"token": "Some",… "position": 1
},
{
"token": "déjà",… "position": 2
},
{
"token": "vu",… "position": 3
},
{
"token": "website",… "position": 4
}
]
}
引擎盖下
使用内联脚本进一步证明我的 html 分析器必须被跳过
请求
GET /html_poc_v2/html_poc_type/_search?pretty=true
{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "doc[field].values",
"params": {
"field": "title"
}
}
}
}
回复
{ …
"hits": { ..
"hits": [
{
"_index": "html_poc_v2",
"_type": "html_poc_type",
…
"fields": {
"terms": [
[
"a",
"agrave",
"d",
"eacute",
"href",
"http",
"j",
"p",
"some",
"somedomain.com",
"title",
"vu",
"website"
]
]
}
}
]
}
}
这里与这个问题类似:Why HTML tag is searchable even if it was filtered in elastic search
我也读过这个惊人的文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-htmlstrip-charfilter.html
ES 版本:1.7.2
请帮忙。
【问题讨论】:
标签: html elasticsearch filter full-text-search mapping