2015-09-16 17 views
8

Trong elasticsearch, có cách nào để thiết lập một máy phân tích có thể tạo ra các khoảng trống vị trí giữa các thẻ khi gặp ngắt dòng hoặc dấu chấm câu không?dấu ngắt dòng hoặc dấu chấm câu như các khoảng trống vị trí trong elasticsearch

Hãy nói rằng tôi chỉ một đối tượng với chuỗi vô nghĩa sau đây (với ngắt dòng) là một trong những lĩnh vực của nó:

The quick brown fox runs after the rabbit. 
Then comes the jumpy frog. 

Máy phân tích tiêu chuẩn sẽ mang lại các thẻ sau đây với các vị trí tương ứng:

0 the 
1 quick 
2 brown 
3 fox 
4 runs 
5 after 
6 the 
7 rabbit 
8 then 
9 comes 
10 the 
11 jumpy 
12 frog 

Điều này có nghĩa là truy vấn match_phrase của the rabbit then comes sẽ khớp với tài liệu này dưới dạng lần truy cập. Có cách nào để giới thiệu khoảng cách vị trí giữa rabbitthen sao cho nó không khớp trừ khi slop được giới thiệu? Tất nhiên, một giải pháp có thể là biến chuỗi đơn thành mảng (một dòng cho mỗi mục) và sử dụng position_offset_gap trong ánh xạ trường, nhưng tôi thực sự giữ một chuỗi đơn với dòng mới (và giải pháp cuối cùng sẽ liên quan đến khoảng trống vị trí lớn hơn cho các dòng mới hơn, ví dụ, đối với các dấu chấm câu).

Trả lời

6

tôi cuối cùng đã tìm ra một giải pháp sử dụng một char_filter để giới thiệu thẻ thêm vào ngắt dòng và dấu chấm câu:

PUT /index 
{            
    "settings": { 
    "analysis": { 
     "char_filter": { 
     "my_mapping": { 
      "type": "mapping", 
      "mappings": [ ".=>\\n_PERIOD_\\n", "\\n=>\\n_NEWLINE_\\n" ] 
     } 
     }, 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "standard", 
      "char_filter": ["my_mapping"], 
      "filter": ["lowercase"] 
     } 
     } 
    } 
    } 
} 

Testing với chuỗi dụ

POST /index/_analyze?analyzer=my_analyzer&pretty 
The quick brown fox runs after the rabbit. 
Then comes the jumpy frog. 

mang lại kết quả sau:

{ 
    "tokens" : [ { 
    "token" : "the", 
    "start_offset" : 0, 
    "end_offset" : 3, 
    "type" : "<ALPHANUM>", 
    "position" : 1 
    }, { 
... snip ... 
    "token" : "rabbit", 
    "start_offset" : 35, 
    "end_offset" : 41, 
    "type" : "<ALPHANUM>", 
    "position" : 8 
    }, { 
    "token" : "_period_", 
    "start_offset" : 41, 
    "end_offset" : 41, 
    "type" : "<ALPHANUM>", 
    "position" : 9 
    }, { 
    "token" : "_newline_", 
    "start_offset" : 42, 
    "end_offset" : 42, 
    "type" : "<ALPHANUM>", 
    "position" : 10 
    }, { 
    "token" : "then", 
    "start_offset" : 43, 
    "end_offset" : 47, 
    "type" : "<ALPHANUM>", 
    "position" : 11 
... snip ... 
    } ] 
} 
Các vấn đề liên quan