2017-08-27 37 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