2014-12-10 4 views
6

Im Index, den ich erstelle, möchte ich eine Abfrage ausführen und dann (unter Verwendung von Facetten) die Schindeln dieser Abfrage zurückgeben. Hier ist der Analysator ich auf den Text bin mit:Verwenden von Schindeln und Stoppwörtern mit Elasticsearch und 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" 
     } 
     } 
    } 
    } 
} 

Das Hauptproblem ist, dass mit Lucene 4.4, stoppen Filter nicht mehr unterstützen die enable_position_increments Parameter Schindeln zu beseitigen, die Stoppwörter enthalten. Stattdessen würde ich Ergebnisse erhalten wie ..

„rot und gelb“

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

Natürlich ist diese STARK skews die Anzahl der zurückgegebenen Schindeln. Gibt es einen Weg nach Lucene 4.4, dies ohne Nachbearbeitung der Ergebnisse zu bewerkstelligen?

+1

Haben Sie eine Lösung für dieses Problem finden? – paweloque

+0

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

Antwort

6

Wahrscheinlich nicht die optimale Lösung, aber am stumpfesten wäre es, einen weiteren Filter zu Ihrem Analysator hinzuzufügen, um "_" Füller-Tokens zu löschen. Im Beispiel unten rief ich es "kill_fillers":

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

Add "kill_fillers" Filter in der Liste der Filter:

"filters":{ 
... 
    "kill_fillers": { 
    "type": "pattern_replace", 
    "pattern": ".*_.*", 
    "replace": "", 
    }, 
... 
} 
Verwandte Themen