2016-05-20 15 views
6

Với tôi đã xác định bộ lọc char html dải của tôi trong phân tích tùy chỉnh của tôiElasticsearch: Strip thẻ HTML trước khi tài liệu lập chỉ mục với bộ lọc html_strip không làm việc

Khi tôi chỉ một tài liệu với nội dung html

Sau đó Tôi hy vọng html sẽ bị loại ra khỏi nội dung được lập chỉ mục

khi truy xuất tài liệu được trả về từ i Ndex shoult không chứa HMTL

THỰC TẾ: Các doc lập chỉ mục html chứa Các lấy doc html chứa

Tôi đã cố gắng xác định các phân tích như index_analyzer như người ta mong đợi và một vài người khác ra khỏi sự tuyệt vọng search_analyzer và phân tích. Dường như không có bất kỳ ảnh hưởng nào đối với tài liệu được lập chỉ mục hoặc truy xuất.

thử nghiệm Doc Indexing chống HTML_Strip lĩnh vực được phân tích:

YÊU CẦU: Tài liệu Ví dụ POST với nội dung 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>" 
} 

Dự kiến ​​: Dữ liệu được lập chỉ mục để có được phân tích cú pháp thông qua việc phân tích html. thực tế: Dữ liệu được lập chỉ mục với html

ỨNG PHÓ

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

Cài đặt và Doc Mapping

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

thử nghiệm để chứng minh Tuỳ chỉnh Analyzer hoạt động hoàn hảo:

YÊU CẦU

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

đáp ứng

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

Dưới mui xe

đi dưới mui xe với một trong dòng kịch bản chứng minh thêm rằng phân tích html của tôi phải được bỏ qua

YÊU CẦU

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

ỨNG PHÓ

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

Tương tự như câu hỏi này ở đây: Why HTML tag is searchable even if it was filtered in elastic search

Tôi cũng đã đọc doc tuyệt vời này: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-htmlstrip-charfilter.html

ES phiên bản: 1.7.2

Hãy Cứu giúp.

Trả lời

2

Bạn đang bối rối trường "_source" trong phản hồi để trả về những gì đang được phân tích và lập chỉ mục. Dường như kỳ vọng của bạn là trường _source trả lời tài liệu được phân tích. Điều này là không chính xác.

Từ documentation;

Trường _source chứa nội dung tài liệu JSON gốc là được chuyển vào thời gian chỉ mục. Bản thân trường _source không được lập chỉ mục (và do đó không thể tìm kiếm được), nhưng nó được lưu trữ sao cho nó có thể được trả về khi thực hiện các yêu cầu tìm nạp, như nhận hoặc tìm kiếm.

Lý tưởng nhất trong trường hợp trên, trong đó bạn muốn định dạng dữ liệu nguồn cho mục đích thuyết trình, nên thực hiện ở cuối ứng dụng khách.

Tuy nhiên con người mà nói một cách để đạt được điều đó đối với trường hợp sử dụng trên được sử dụng script fieldskeyword-tokenizer như sau:

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

Kết quả:

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

lưu ý tôi tin rằng ở trên là một xấu ý tưởng kể từ khi tước các thẻ html có thể dễ dàng đạt được trên đầu khách hàng và bạn sẽ có quyền kiểm soát nhiều hơn đối với định dạng hơn tùy thuộc vào một công việc xung quanh như thế này. Quan trọng hơn là nó có thể thực hiện nó ở phía khách hàng.

+0

Đây cũng là trường * _source * mà tôi muốn ngăn không cho các thẻ html. Nói cách khác, cùng với việc không lập chỉ mục các thẻ html, tôi sẽ không muốn trả về html trên GET/Search. Bất kỳ ý tưởng/Gợi ý về cách để đạt được điều này? – DaddyMoe

+1

tôi đã cập nhật câu trả lời – keety

+0

Cảm ơn một loạt các keety. Tuyệt vời cho thấy, mặc dù một công việc xung quanh, bạn là đúng, không phải là một ý tưởng tốt. Nó cũng sẽ yêu cầu bật kịch bản trên cụm Live của tôi. Cũng sẽ không tương thích với các _plugins điểm cuối elasticsearch tùy chỉnh mà chúng ta có được gắn với các trường kéo từ _source của các tài liệu đã nói của tôi như tiêu đề, nội dung và mô tả. – DaddyMoe

Các vấn đề liên quan