我有一个由不同的应用程序标记的文本。我不希望在查询时返回对这些标记的查询。
我尝试使用html_strip,但我仍然可以搜索这些标签。
标签的示例可能会有所不同,但它们与<PERSON>Freddy</PERSON>
类似。
我还尝试使用<span>Freddy</span>
,在这两个结果中,我都可以搜索 span 或 PERSON 并获得结果,而不会在其他任何地方出现这些词。
我做错了什么?
索引映射:
{
"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>>"
]
}
}
]
...
答案 0 :(得分:3)
这里有几个问题;首先,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>
起作用)。您可以改为使用pattern filter。