2015-08-26 17 views
7

Come si effettua una ricerca per una partita con gambo?Partita Elasticsearch con derivazione

I.e. al momento ho molti documenti che contengono la parola "skateboard" nel campo item_title, ma solo 3 documenti che contengono la parola "skateboard". A causa di questo, quando faccio la seguente ricerca:

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

ho solo ottenere 3 risultati. Tuttavia, vorrei anche i documenti con la parola "skateboard" da restituire.

Da quello che ho capito da Elasticsearch mi aspetto che ciò avvenga specificando una mappatura sul campo item_title che contiene un analizzatore che indicizza la versione stemmed di ogni parola, ma non riesco a trovare la documentazione su come per fare questo, il che suggerisce che è fatto in un modo diverso.

Suggerimenti?

risposta

7

Ecco un esempio:

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

Indice alcuni documenti di esempio:

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

Eseguire la query:

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

e vedere i risultati:

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

Ho aggiunto, inoltre, l'elemento fielddata_fields in modo da poter vedere come il contenuto del campo è stato indicizzato. Come puoi vedere, in entrambi i casi il termine indicizzato è skateboard.

+0

Volevo sottolineare che '" tipo ":" stringa "' in 'mappings' dovrebbe essere' "tipo": "testo" 'se stai usando una versione più recente di Elasticsearch (https://stackoverflow.com/ un/47454366/1067590) – Tayler