我有一个由其他应用程序标记的文本。我不希望查询这些标签时返回查询。
我尝试使用html_strip,但仍可以搜索这些标签。
标签的示例可能有所不同,但与相似<PERSON>Freddy</PERSON>。我也尝试过<span>Freddy</span>,在两个结果中,我都可以搜索 span 或 PERSON 并获得结果,而这些词不会出现在其他任何地方。
<PERSON>Freddy</PERSON>
<span>Freddy</span>
我究竟做错了什么?
索引映射:
{ "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实际上根本没有获得该映射)。您可以使用此:
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>,也会看到相同的结果,但这是因为查询文本的分析方式与索引文本的分析方式相同。)
Hello <span>Freddy</span>
Hello Freddy
span
请注意,由于您已使用了分keyword词器,因此如果搜索Hello或,将不会获得任何结果Freddy。如果要在字符串中搜索,而不是搜索完整的字符串(或通配符,正则表达式等),则应使用其他令牌生成器(如standard令牌生成器)。
keyword
Hello
Freddy
standard
另一个警告:html_strip过滤器似乎仅过滤有效的html标签(因此不适用于<PERSON>)。您可能可以改用模式过滤器。
html_strip
<PERSON>