ElasticSearch阻止html标签可搜索

我有一个由其他应用程序标记的文本。我不希望查询这些标签时返回查询。

我尝试使用html_strip,但仍可以搜索这些标签。

标签的示例可能有所不同,但与相似<PERSON>Freddy</PERSON>。我也尝试过<span>Freddy</span>,在两个结果中,我都可以搜索

spanPERSON 并获得结果,而这些词不会出现在其他任何地方。

我究竟做错了什么?

索引映射:

{

"mapping": {

"properties":{

"text":{

"type":"text",

"analyzer":"my_analyzer"

}

}

},

"settings": {

"analysis": {

"analyzer": {

"my_analyzer": {

"tokenizer": "keyword",

"char_filter": [

"my_char_filter"

]

}

},

"char_filter": {

"my_char_filter": {

"type": "html_strip"

}

}

}

}

}

询问

{

"query":{

"match":{

"text":"span"

}

},

"highlight":{

"fields":{

"text":{}

}

}

}

响应:

..

"hits": [

{

"_index": "my_index",

"_type": "wat",

"_id": "1",

"_score": 0.39556286,

"_source": {

"text": "Hello <span>Freddy</span>"

},

"highlight": {

"text": [

"Hello <<em>span</em>>Freddy</<em>span</em>>"

]

}

}

]

...

回答:

你这里有几个问题。首先,mapping应该是mappings,并且在声明映射时丢失了类型(因此您的类型wat实际上根本没有获得该映射)。您可以使用此:

{

"mappings": {

"wat": {

"properties": {

"text": {

"type": "text",

"analyzer": "my_analyzer"

}

}

}

},

"settings": {

"analysis": {

"analyzer": {

"my_analyzer": {

"tokenizer": "keyword",

"char_filter": [

"my_char_filter"

]

}

},

"char_filter": {

"my_char_filter": {

"type": "html_strip"

}

}

}

}

}

您可以使用get mapping

API来确认您看到的映射类型符合wat您的期望。

然后,如果您为索引Hello <span>Freddy</span>并搜索Hello Freddy,您将看到此结果。存储的术语是Hello

Freddy,但是您将span在搜索结果中看到标记,因为结果返回的是源(您索引的值),而不是分析的术语。(如果您搜索Hello

<span>Freddy</span>,也会看到相同的结果,但这是因为查询文本的分析方式与索引文本的分析方式相同。)

请注意,由于您已使用了分keyword词器,因此如果搜索Hello或,将不会获得任何结果Freddy。如果要在字符串中搜索,而不是搜索完整的字符串(或通配符,正则表达式等),则应使用其他令牌生成器(如standard令牌生成器)。

另一个警告:html_strip过滤器似乎仅过滤有效的html标签(因此不适用于<PERSON>)。您可能可以改用模式过滤器。

以上是 ElasticSearch阻止html标签可搜索 的全部内容, 来源链接: utcz.com/qa/421866.html

回到顶部