2014-12-10 7 views
6

Nell'indice che sto costruendo, sono interessato a eseguire una query, quindi (utilizzando gli sfaccettature) restituire i tegami di quella query. Ecco l'analizzatore che sto usando sul testo:Utilizzo di scandole e parole di stop con Elasticsearch e Lucene 4.4

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "shingleAnalyzer": { 
      "tokenizer": "standard", 
      "filter": [ 
      "standard", 
      "lowercase", 
      "custom_stop", 
      "custom_shingle", 
      "custom_stemmer" 
      ] 
     } 
     }, 
     "filter": { 
     "custom_stemmer" : { 
      "type": "stemmer", 
      "name": "english" 
     }, 
     "custom_stop": { 
      "type": "stop", 
      "stopwords": "_english_" 
     }, 
     "custom_shingle": { 
      "type": "shingle", 
      "min_shingle_size": "2", 
      "max_shingle_size": "3" 
     } 
     } 
    } 
    } 
} 

Il problema principale è che, con Lucene 4.4, stop filtri non supportano più il parametro enable_position_increments per eliminare l'herpes zoster che contengono parole di stop. Invece, mi piacerebbe avere risultati come ..

"rosso e giallo"

"terms": [ 
    { 
     "term": "red", 
     "count": 43 
    }, 
    { 
     "term": "red _", 
     "count": 43 
    }, 
    { 
     "term": "red _ yellow", 
     "count": 43 
    }, 
    { 
     "term": "_ yellow", 
     "count": 42 
    }, 
    { 
     "term": "yellow", 
     "count": 42 
    } 
] 

Naturalmente questo distorce notevolmente il numero di herpes zoster restituiti. C'è un modo post-Lucene 4.4 per gestire questo senza fare post-elaborazione sui risultati?

+1

Hai trovato una soluzione per questo problema? – paweloque

+0

domanda duplicata: http://stackoverflow.com/questions/22609100/elasticsearch-shingles-with-stop-words-elimination – paweloque

risposta

6

Probabilmente non è la soluzione più ottimale, ma il più diretto sarebbe aggiungere un altro filtro all'analizzatore per eliminare i token di riempimento "_". Nell'esempio che segue ho chiamato "kill_fillers":

"shingleAnalyzer": { 
     "tokenizer": "standard", 
     "filter": [ 
     "standard", 
     "lowercase", 
     "custom_stop", 
     "custom_shingle", 
     "custom_stemmer", 
     "kill_fillers" 
     ], 
     ... 

Add "kill_fillers" filtro alla tua lista di filtri:

"filters":{ 
... 
    "kill_fillers": { 
    "type": "pattern_replace", 
    "pattern": ".*_.*", 
    "replace": "", 
    }, 
... 
} 
Problemi correlati