2011-11-09 13 views
9

Sto utilizzando una libreria php di elasticsearch per indicizzare e trovare documenti nel mio sito web. Questo è il codice per la creazione dell'indice:Elasticsearch che non restituisce corrispondenze al singolare/plurale

curl -XPUT 'http://localhost:9200/test/' -d ' 
{ 
    "index": { 
    "numberOfShards": 1, 
    "numberOfReplicas": 1 
    } 
}' 

Ho quindi utilizzare ricciolo XPUT aggiungere documenti all'indice e XGET per interrogare l'indice. Ciò funziona bene, ad eccezione del fatto che i singoli e i plurali delle parole di query non vengono confrontati nell'indice durante la restituzione dei risultati. Ad esempio, quando cerco "discussioni", le corrispondenze per "discussione" non vengono restituite e viceversa. Perché è così? Ho pensato che questo si è preso cura di default in elasticsearch. C'è qualcosa che dobbiamo menzionare esplicitamente perché corrisponda alle forme singolare/plurale?

risposta

6

In qualche modo snowball non funziona per me ... che ottiene gli errori come ho detto nel commento a @ imotov di risposta . Ho usato stelo di porter e ha funzionato perfettamente per me. Questa è la configurazione che ho usato:

curl -XPUT localhost:9200/index_name -d ' 
{ 
"settings" : { 
    "analysis" : { 
     "analyzer" : { 
      "stem" : { 
       "tokenizer" : "standard", 
       "filter" : ["standard", "lowercase", "stop", "porter_stem"] 
      } 
     } 
    } 
}, 
"mappings" : { 
    "index_type_1" : { 
     "dynamic" : true, 
     "properties" : { 
      "field1" : { 
       "type" : "string", 
       "analyzer" : "stem" 
      }, 
      "field2" : { 
       "type" : "string", 
       "analyzer" : "stem" 
      } 
     } 
     } 
    } 
}' 
7

L'analizzatore di elascticsearch predefinito non esegue la derivazione e questo è ciò che è necessario gestire al plurale/singolare. Si può provare a utilizzare Snowball Analyzer per i vostri campi di testo per vedere se funziona meglio per il vostro caso d'uso:

curl -XPUT 'http://localhost:9200/test' -d '{ 
    "settings" : { 
     "index" : { 
      "number_of_shards" : 1, 
      "number_of_replicas" : 1 
     } 
    }, 
    "mappings" : { 
     "page" : { 
      "properties" : { 
       "mytextfield": { "type": "string", "analyzer": "snowball", "store": "yes"} 
      } 
     } 
    } 
}' 
+0

Grazie per la risposta. Fammi provare questo e vedere se funziona – Ninja

+0

Ho provato questo e ottengo un errore: "Messaggio: Impossibile caricare l'impostazione della classe [tipo] con valore [palla di neve]". Dovrei installare qualcosa di più qui? Se sì, da dove e da dove? – Ninja

+0

Quale versione di elasticsearch stai usando? L'ho testato su 0.17 e su master e funziona bene con entrambe le impostazioni predefinite. Hai modificato il comando in qualche modo? – imotov

6

Dal filtro 'porterStem' è ipersensibile, è più adatto se si utilizza il filtro 'minimal_english'. 'porterStem' crea token simili per parole come:

la ricerca di 'Test' ti darà 'Test', 'Test', 'Test', 'Tester' et. al.

Ma "minimal_english" restituirà solo "Test" e "Test".

+2

La tua risposta non è stata contrassegnata come corretta poiché è arrivata molto più tardi della prima, ma questa è ovviamente una soluzione molto migliore. l'analizzatore di palle di neve è orribilmente impreciso. porterStem è un po 'meglio e potrebbe essere utilizzabile. kstem è ancora meno sensibile e minimal_english è il meno sensibile. Ma la palla di neve è orribile. –

+2

Non riesco a trovare minimal_english .. – Sekai

+0

@Sekai nel tuo codice Java minimal_english può essere importato da org.apache.lucene.analysis.en.EnglishMinimalStemFilter e per l'utilizzo in una query sarà "filter: minimal_english" –

Problemi correlati