2017-08-27 518 views
1

我有一个文本被另一个应用程序标记。我不希望在查询时返回这些标签的查询。ElasticSearch防止搜索html标签

我试过使用html_strip,但我仍然能够搜索这些标签。

标签的示例可能会有所不同,但它们与<PERSON>Freddy</PERSON>类似。 我也试过<span>Freddy</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>>" 
        ] 
       } 
      } 
     ] 
... 
+1

它似乎你在你的映射有一个错字:'analzer'应该读'分析器' – Val

+0

@Val感谢您指出这一点。我改成了分析仪,但没有解决问题.. – aclokay

+0

您是否删除了索引,重新创建索引并重新编制了索引数据? – Val

回答

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标记器,因此您将得不到结果如果您搜索HelloFreddy。如果你想在字符串内搜索,而不是搜索完整的字符串(或通配符,正则表达式等),你应该使用不同的标记器(如standard标记器)。

另一个警告:html_strip过滤器似乎只过滤有效的html标签(所以它不适用于<PERSON>)。您可以改为使用pattern filter

+0

谢谢!解决了问题+关于tokenizer和模式过滤器的伟大建议:) – aclokay