ElasticSearch可防止html标记被搜索

时间:2017-08-27 08:50:22

标签: elasticsearch

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

我尝试使用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>>"
                    ]
                }
            }
        ]
...

1 个答案:

答案 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令牌工具,因此如果您搜索HelloFreddy,则不会获得任何结果。如果你想在字符串中搜索,而不是搜索完整的字符串(或通配符,正则表达式等),你应该使用不同的标记器(如standard标记器)。

另一个警告:html_strip过滤器似乎只过滤了有效的html标记(因此它不会对<PERSON>起作用)。您可以改为使用pattern filter