2017-08-27 2 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'は' analyzer'を読むべきです – Val

+0

@Valこれを指摘してくれてありがとう。私はアナライザーに変更しましたが、問題を解決しませんでした.. – aclokay

+0

インデックスを削除し、再作成してデータを再インデックス付けしましたか? – Val

答えて

3

あなたがここでの問題のカップルを持っています。最初にmappingmappingsでなければなりません。マッピングを宣言するとタイプが見当たりません(したがって、タイプwatはそのマッピングを実際に取得していません)。あなたはこれを使用することができます:あなたはあなたが期待するようにあなたがタイプwatのマッピングを参照することを確認するためにget mapping apiを使用することができます

{ 
    "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" 
     } 
     } 
    } 
    } 
} 

次に、インデックスHello <span>Freddy</span>を検索し、Hello Freddyを検索すると、この結果が表示されます。保存されている語句はHello Freddyですが、結果には分析された語句ではなく索引付けされたソースが返されるため、検索結果にspanタグが表示されます。 (Hello <span>Freddy</span>を検索すると同じ結果が表示されますが、クエリテキストがインデックス付きテキストと同じ方法で分析されるためです)

keywordトークナイザを使用しているため、 HelloまたはFreddyを検索すると結果が表示されます。文字列内を検索する場合は、完全な文字列(またはワイルドカード、正規表現など)を検索する代わりに、別のトークナイザ(standardトークナイザなど)を使用する必要があります。

もう1つの警告:html_stripフィルタは、有効なHTMLタグのみをフィルタリングするようです(<PERSON>では機能しません)。おそらくpattern filterを代わりに使用できます。

+0

ありがとう!トークナイザーとパターンフィルターに関する問題+大きなアドバイスを解決しました:) – aclokay

関連する問題