2015-09-16 15 views
8

W elastycznej analizie, czy istnieje sposób na skonfigurowanie analizatora, który tworzy luki w pozycjach między tokenami, gdy napotykane są znaki podziałowe lub znaki interpunkcyjne?Podziały linii lub znaki interpunkcyjne jako luki w pozycjach w elasticssearch

Powiedzmy indeks I obiekt z następującym bezsensownym ciągiem (z linii przerwy) jako jeden ze swoich dziedzin:

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

Standardowy analizator przyniesie następujące znaki z odpowiednich pozycjach:

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 

Oznacza to, że zapytanie match_phrase z the rabbit then comes dopasuje ten dokument jako trafienie. Czy istnieje sposób wprowadzenia luki w pozycji między rabbit i then, aby nie pasowała, chyba że wprowadzono slop?

Oczywiście, rozwiązaniem może być przekształcenie pojedynczego ciągu znaków w tablicę (jedna linia na wpis) i użycie position_offset_gap w mapowaniu w terenie, ale wolałbym raczej zachować pojedynczy ciąg z liniami (i ostateczne rozwiązanie wymagałoby większe luki w pozycjach dla znaków nowej linii niż, powiedzmy, dla znaków interpunkcyjnych).

Odpowiedz

6

I w końcu zorientowali się rozwiązanie używając char_filter wprowadzić dodatkowe znaki na podziały wierszy i znaków interpunkcyjnych:

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

Testowania na przykładzie ciąg

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

dała następujący wynik:

{ 
    "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 ... 
    } ] 
} 
Powiązane problemy