我有一个被不同应用程序标记的文本。我不希望在查询时返回对这些标签的查询。
我尝试使用 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"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
询问
{
"query":{
"match":{
"text":"span"
}
},
"highlight":{
"fields":{
"text":{}
}
}
}
Run Code Online (Sandbox Code Playgroud)
回复:
..
"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>>"
]
}
}
]
...
Run Code Online (Sandbox Code Playgroud)
小智 5
你在这里有几个问题;首先,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"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用get mapping api来确认您看到的类型的映射是否符合wat您的预期。
然后如果你 indexHello <span>Freddy</span>和 search Hello Freddy,你会看到这个结果。存储的术语是Hello Freddy,但您将span在搜索结果中看到标签,因为结果返回源(您编入索引的值),而不是分析的术语。(如果您搜索Hello <span>Freddy</span>,您也会看到相同的结果,但这是因为查询文本的分析方式与索引文本相同。)
请注意,由于您使用了分keyword词器,因此如果您搜索Hello或,您将不会得到任何结果Freddy。如果您想在字符串中搜索,而不是搜索完整字符串(或通配符、正则表达式等),您应该使用不同的分词器(如分standard词器)。
另一个警告:html_strip过滤器似乎只过滤有效的 html 标签(因此它不适用于<PERSON>)。您可能可以改用模式过滤器。
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |