2016-05-20 7 views
6

を動作していない前に、その後、私はhtmlがインデックスされたコンテンツのストリップであることを期待しますElasticsearch:ストリップHTMLタグhtml_stripフィルターとインデックスドキュメントは、私が</p> <p><strong>HTMLコンテンツ</p> <p><strong>と</strong> Iインデックス文書私のカスタム・アナライザで私のhtmlストリップチャーフィルタを指定している</strong>考える

および NDEXはHMTL含まれていませshoult

ACTUAL: インデックス付きのドキュメントに含まれるHTML

は、私は1つが期待すると絶望のsearch_analyzerのうちいくつかの他のと同じようにindex_analyzerとしてアナライザを指定しようとしている取得したドキュメントに含まれるHTML分析装置。 Nonは、索引付けされているか取り出されているdocに何らかの影響を与えるようです。

HTML_Stripに対して

テストドキュメントインデックスフィールドを分析した:

REQUEST:HTMLコンテンツ期待

POST /html_poc_v2/html_poc_type/02 
{ 
    "description": "Description <p>Some d&eacute;j&agrave; vu <a href=\"http://somedomain.com>\">website</a>", 
    "title": "Title <p>Some d&eacute;j&agrave; vu <a href=\"http://somedomain.com>\">website</a>", 
    "body": "Body <p>Some d&eacute;j&agrave; vu <a href=\"http://somedomain.com>\">website</a>" 
} 

と例POSTドキュメント:HTML解析器を介して解析されているために索引付けデータ。 実際:データをHTML

応答

{ 
    "_index": "html_poc_v2", "_type": "html_poc_type", "_id": "02", ... 
    "_source": { 
     "description": "Description <p>Some d&eacute;j&agrave; vu <a href=\"http://somedomain.com>\">website</a>", 
     "title": "Title <p>Some d&eacute;j&agrave; vu <a href=\"http://somedomain.com>\">website</a>", 
     "body": "Body <p>Some d&eacute;j&agrave; vu <a href=\"http://somedomain.com>\">website</a>" 
    } 
} 

設定とドクマッピングでインデックス化され

PUT /html_poc_v2 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_html_analyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "char_filter": [ 
      "html_strip" 
      ] 
     } 
     } 
    }, 
    "mappings": { 
     "html_poc_type": { 
     "properties": { 
      "body": { 
      "type": "string", 
      "analyzer": "my_html_analyzer" 
      }, 
      "description": { 
      "type": "string", 
      "analyzer": "my_html_analyzer" 
      }, 
      "title": { 
      "type": "string", 
      "search_analyser": "my_html_analyzer" 
      }, 
      "urlTitle": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

テスト証明するためのカスタム・アナライザは完璧に動作します:

REQUEST

GET /html_poc_v2/_analyze?analyzer=my_html_analyzer 
{<p>Some d&eacute;j&agrave; vu <a href="http://somedomain.com>">website</a>} 

応答

{ 
    "tokens": [ 
     { 
     "token": "Some",… "position": 1 
     }, 
     { 
     "token": "déjà",… "position": 2 
     }, 
     { 
     "token": "vu",… "position": 3 
     }, 
     { 
     "token": "website",… "position": 4 
     } 
    ] 
} 

ボンネットの下に

私のhtmlアナライザは

REQUESTをスキップされていなければならないこと、さらには、インラインスクリプトプルーフとボンネットの下に行きます

ESバージョン:1.7.2

してください私もこの素晴らしいドキュメントを読んだWhy HTML tag is searchable even if it was filtered in elastic search

:ここでは、この質問に似

GET /html_poc_v2/html_poc_type/_search?pretty=true 
{ 
    "query" : { 
    "match_all" : { } 
    }, 
    "script_fields": { 
    "terms" : { 
     "script": "doc[field].values", 
     "params": { 
      "field": "title" 
     } 
    } 
    } 
} 

応答

{ … 
    "hits": { .. 
     "hits": [ 
     { 
      "_index": "html_poc_v2", 
      "_type": "html_poc_type", 
      … 
      "fields": { 
       "terms": [ 
        [ 
        "a", 
        "agrave", 
        "d", 
        "eacute", 
        "href", 
        "http", 
        "j", 
        "p", 
        "some", 
        "somedomain.com", 
        "title", 
        "vu", 
        "website" 
        ] 
       ] 
      } 
     } 
     ] 
    } 
} 

助けて。

答えて

2

あなたは分析してインデックス化されているものを返すように反応して「_source」フィールドを混乱されています。 _sourceフィールドが解析されたドキュメントを返すと予想されるようです。これは間違っています。

documentationから;

_sourceフィールドには、インデックス時に であった元のJSONドキュメント本文が含まれています。 _sourceフィールド自体は索引付けされておらず(したがって、 は検索可能ではありません)、getやsearchなどのフェッチ要求を実行すると、 が返されるように格納されます。あなたはそれがクライアント側で実行する必要があり、プレゼンテーションの目的のために、ソース・データをフォーマットしたい上記の場合における理想的

しかし、次のように上記のユースケースのためにそれを達成するための一つの方法は、script fieldskeyword-tokenizerを使用しているとされていること:

PUT test 
{ 
    "settings": { 
     "analysis": { 
     "analyzer": { 
      "my_html_analyzer": { 
       "type": "custom", 
       "tokenizer": "standard", 
       "char_filter": [ 
        "html_strip" 
       ] 
      }, 
      "parsed_analyzer": { 
       "type": "custom", 
       "tokenizer": "keyword", 
       "char_filter": [ 
        "html_strip" 
       ] 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "test": { 
     "properties": { 
      "body": { 
       "type": "string", 
       "analyzer": "my_html_analyzer", 
       "fields": { 
        "parsed": { 
        "type": "string", 
        "analyzer": "parsed_analyzer" 
        } 
       } 
      } 
     } 
     } 
    } 
} 


PUT test/test/1 
{ 
    "body" : "Title <p> Some d&eacute;j&agrave; vu <a href='http://somedomain.com'> website </a> <span> this is inline </span></p> " 
} 

GET test/_search 
{ 
    "query" : { 
    "match_all" : { } 
    }, 
    "script_fields": { 
    "terms" : { 
     "script": "doc[field].values", 
     "params": { 
      "field": "body.parsed" 
     } 
    } 
    } 
} 

結果:私は上記のが悪いと信じ

{ 
    "_index": "test", 
    "_type": "test", 
    "_id": "1", 
    "_score": 1, 
    "fields": { 
     "terms": [ 
      "Title \n Some déjà vu website this is inline \n " 
      ] 
     } 
    } 

ノートアイデアはhtmlタグを取り除くことがクライアント側で容易に実現できるため、このような回避策に依存するよりも、書式化に関してより多くの制御が可能です。もっと重要なのは、クライアント側でそれをやり遂げているのかもしれません。

+0

htmlタグを持たないようにするには、* _source *フィールドもあります。言い換えれば、htmlタグの索引付けと並んで、私はGET/Searchでもhtmlを返さないことにします。どのようにこれを達成するためのアイデア/提案? – DaddyMoe

+1

答えを更新しました – keety

+0

ありがとうございました。素晴らしいことは、あなたの周りの仕事は良いことだと思いますが、良い考えではありません。また、ライブクラスタでスクリプトを有効にする必要があります。また、タイトル、ボディー、説明など私の言った文書の_sourceからフィールドを引き出すために結びつけているカスタムelasticsearchエンドポイント_pluginsと互換性がありません。 – DaddyMoe

関連する問題