2015-09-16 19 views
8

In elasticsearch, esiste un modo per impostare un analizzatore che generi intervalli di posizione tra i token quando vengono rilevati interruzioni di riga o segni di punteggiatura?interruzioni di riga o segni di punteggiatura come interruzioni di posizione in elasticsearch

Diciamo indice I di un oggetto con la seguente stringa senza senso (con interruzione di linea) come uno dei suoi campi:

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

L'analizzatore norma produrrà i seguenti token di rispettive posizioni:

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 

Ciò significa che una query match_phrase di the rabbit then comes corrisponderà a questo documento come hit. C'è un modo per introdurre uno spazio tra rabbit e then in modo che non corrisponda a meno che non sia stato introdotto un slop?

Ovviamente, una soluzione alternativa potrebbe essere quella di trasformare la stringa singola in una matrice (una riga per voce) e utilizzare position_offset_gap nella mappatura dei campi, ma preferirei mantenere una singola stringa con newline (e una soluzione definitiva implicherebbe spazi vuoti di posizione più grandi per le righe nuove rispetto, ad esempio, ai segni di punteggiatura).

risposta

6

alla fine ho capito una soluzione che utilizza un char_filter per introdurre gettoni in più su interruzioni di riga e segni di punteggiatura:

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

Test con la stringa di esempio

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

produce il seguente risultato:

{ 
    "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 ... 
    } ] 
} 
Problemi correlati