2015-08-26 13 views
7

Wie suche ich nach einem Stemed-Match?Elasticsearch passt zu stemming

I.e. Im Moment habe ich viele Dokumente, die das Wort "Skateboard" im Feld item_title enthalten, aber nur 3 Dokumente, die das Wort "Skateboards" enthalten. Aus diesem Grund, wenn ich die folgende Suche mache:

POST /my_index/my_type/_search 
{ 
    "size": 100, 
    "query" : { 
     "multi_match": { 
      "query": "skateboards", 
      "fields": [ "item_title^3" ] 
     } 
    } 
} 

Ich bekomme nur 3 Ergebnisse. Ich möchte aber auch Dokumente mit dem Wort "Skateboard" zurückgeben.

Von was ich von Elasticsearch verstehe, würde ich erwarten, dass dies durch Angabe einer Zuordnung auf dem item_title Feld, das einen Analysator enthält, der die Stammversion jedes Wortes indiziert, aber ich kann nicht scheinen, die Dokumentation zu finden, wie um dies zu tun, was darauf hindeutet, dass es anders geht.

Vorschläge?

Antwort

7

Hier ein Beispiel:

PUT /stem 
{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "filter_stemmer": { 
      "type": "stemmer", 
      "language": "english" 
     } 
     }, 
     "analyzer": { 
     "tags_analyzer": { 
      "type": "custom", 
      "filter": [ 
      "standard", 
      "lowercase", 
      "filter_stemmer" 
      ], 
      "tokenizer": "standard" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "item_title": { 
      "analyzer": "tags_analyzer", 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

Index einige Beispiel docs:

POST /stem/test/1 
{ 
    "item_title": "skateboards" 
} 
POST /stem/test/2 
{ 
    "item_title": "skateboard" 
} 
POST /stem/test/3 
{ 
    "item_title": "skate" 
} 

Führen Sie die Abfrage:

GET /stem/test/_search 
{ 
    "query": { 
    "multi_match": { 
     "query": "skateboards", 
     "fields": [ 
     "item_title^3" 
     ] 
    } 
    }, 
    "fielddata_fields": [ 
    "item_title" 
    ] 
} 

Und die Ergebnisse sehen:

"hits": [ 
    { 
     "_index": "stem", 
     "_type": "test", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "item_title": "skateboards" 
     }, 
     "fields": { 
      "item_title": [ 
       "skateboard" 
      ] 
     } 
    }, 
    { 
     "_index": "stem", 
     "_type": "test", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
      "item_title": "skateboard" 
     }, 
     "fields": { 
      "item_title": [ 
       "skateboard" 
      ] 
     } 
    } 
    ] 

Ich habe auch das Element fielddata_fields hinzugefügt, so dass Sie sehen können, wie der Inhalt des Feldes indiziert wurde. Wie Sie sehen, ist der indizierte Begriff in beiden Fällen skateboard.

+0

Wollte darauf hinweisen, dass '" type ":" string "' in 'mappings' sollte" "type": "text" 'wenn Sie eine neuere Version von Elasticsearch verwenden (https://stackoverflow.com/ a/47454366/1067590) – Tayler