2013-09-07 11 views
5

Sto cercando di ottenere alcune funzioni come nGram e sinonimi funzionanti, ma non sto avendo fortuna.ElasticSearch ricerca parziale corrispondente

Sto seguendo this blog post. Ho provato ad adattare i mapping e le query ai miei dati, e corrisponderà solo ai termini esatti. Ho anche provato a utilizzare i dati esatti dell'articolo da this gist con lo stesso risultato.

Ecco la mappatura:

{ 
    "mappings": { 
     "item": { 
     "properties": { 
      "productName": { 
       "fields": { 
        "partial": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name", 
        "type":"string" 
        }, 
        "partial_back": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name_back", 
        "type":"string" 
        }, 
        "partial_middle": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_middle_name", 
        "type":"string" 
        }, 
        "productName": { 
        "type":"string", 
        "analyzer":"full_name" 
        } 
       }, 
       "type":"multi_field" 
      }, 
      "productID": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "warehouse": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "vendor": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "productDescription": { 
       "type":"string", 
       "analyzer":"full_name" 
      }, 
      "categories": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "stockLevel": { 
       "type":"integer", 
       "index":"not_analyzed" 
      }, 
      "cost": { 
       "type":"float", 
       "index":"not_analyzed" 
      } 
     } 
     }, 
     "settings": { 
     "analysis": { 
      "filter": { 
       "name_ngrams": { 
        "side":"front", 
        "max_gram":50, 
        "min_gram":2, 
        "type":"edgeNGram" 
       }, 
       "name_ngrams_back": { 
        "side":"back", 
        "max_gram":50, 
        "min_gram":2, 
        "type":"edgeNGram" 
       }, 
       "name_middle_ngrams": { 
        "type":"nGram", 
        "max_gram":50, 
        "min_gram":2 
       } 
      }, 
      "analyzer": { 
       "full_name": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       }, 
       "partial_name": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       }, 
       "partial_name_back": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams_back" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       }, 
       "partial_middle_name": { 
        "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_middle_ngrams" 
        ], 
        "type":"custom", 
        "tokenizer":"standard" 
       } 
      } 
     } 
     } 
    } 
} 

E la query di ricerca (ho tolto il filtro per cercare di tornare più risultati):

{ 
    "size":20, 
    "from":0, 
    "sort":[ 
     "_score" 
    ], 
    "query": { 
     "bool": { 
     "should":[ 
      { 
       "text": { 
        "productName": { 
        "boost":5, 
        "query":"test query", 
        "type":"phrase" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial": { 
        "boost":1, 
        "query":"test query" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_middle": { 
        "boost":1, 
        "query":"test query" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_back": { 
        "boost":1, 
        "query":"test query" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

Utilizzando la query di cui sopra dalla sostanza, se io rimuovere il codice seguente dalla prima query bool

"text":{ 
    "productName":{ 
     "boost":5, 
     "query":"test query", 
     "type":"phrase" 
    } 
} 

in modo che non tornerà scontri diretti, n o importa quale sia il mio termine di ricerca, non restituisco ancora risultati.

presumo che mi manca qualcosa lampante, e non so davvero quali altre informazioni sono rilevanti, quindi si prega di prendere facilmente su di me.

+0

Puoi pubblicare la tua mappatura per favore! 'arricciare http: // domain.com/index/type/_mapping' Solo per verificare che sia impostato correttamente. – ramseykhalaf

+1

Anche 'text' è deprecato, usa' match'! – ramseykhalaf

+0

@ramseykhalaf Hai appena risolto questo problema, ho prima richiamato la mappatura e ho visto json e suppongo che fosse corretto, ma in realtà guardandolo ho notato che era tutto incasinato. Ti darò credito nella risposta che scrivo! – Rockstar04

risposta

5

Sembra che ho trovato la risposta al mio problema, copiare e incollare ciecamente. L'articolo del blog a cui mi sono collegato sembra non essere aggiornato e il JSON per i comandi non funziona più correttamente (ma non ha generato errori durante l'invio dei comandi).

Ecco il codice per creare l'indice che ho usato:

{ 
    "settings": { 
     "analysis": { 
     "filter": { 
      "name_ngrams": { 
       "side":"front", 
       "max_gram":50, 
       "min_gram":2, 
       "type":"edgeNGram" 
      }, 
      "name_ngrams_back": { 
       "side":"back", 
       "max_gram":50, 
       "min_gram":2, 
       "type":"edgeNGram" 
      }, 
      "name_middle_ngrams": { 
       "type":"nGram", 
       "max_gram":50, 
       "min_gram":2 
      } 
     }, 
     "analyzer": { 
      "full_name": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      }, 
      "partial_name": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      }, 
      "partial_name_back": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_ngrams_back" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      }, 
      "partial_middle_name": { 
       "filter":[ 
        "standard", 
        "lowercase", 
        "asciifolding", 
        "name_middle_ngrams" 
       ], 
       "type":"custom", 
       "tokenizer":"standard" 
      } 
     } 
     } 
    }, 
    "mappings" : { 
     "product": { 
     "properties": { 
      "productName": { 
       "fields": { 
        "partial": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name", 
        "type":"string" 
        }, 
        "partial_back": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_name_back", 
        "type":"string" 
        }, 
        "partial_middle": { 
        "search_analyzer":"full_name", 
        "index_analyzer":"partial_middle_name", 
        "type":"string" 
        }, 
        "productName": { 
        "type":"string", 
        "analyzer":"full_name" 
        } 
       }, 
       "type":"multi_field" 
      }, 
      "productID": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "warehouse": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "vendor": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "productDescription": { 
       "type":"string", 
       "analyzer":"full_name" 
      }, 
      "categories": { 
       "type":"string", 
       "analyzer":"simple" 
      }, 
      "stockLevel": { 
       "type":"integer", 
       "index":"not_analyzed" 
      }, 
      "cost": { 
       "type":"float", 
       "index":"not_analyzed" 
      } 
     } 
     } 
    } 
} 

Ecco il codice che ho usato per inserire un record di prova (io ho usato questo 3 volte con un po 'cambiati i dati)

{ 
    "productName": "Thingey", 
    "productID": "asdfasef9816", 
    "warehouse": "usa", 
    "vendor": "Cool Things Inc", 
    "productDescription": "This is a cool gizmo", 
    "categories": "Cool Things", 
    "stockLevel": 6, 
    "cost": 15.31 
} 

E infine il JSON per la query di ricerca.

{ 
    "size":20, 
    "from":0, 
    "sort":[ 
     "_score" 
    ], 
    "query": { 
     "bool": { 
     "should":[ 
      { 
       "text": { 
        "productName.partial": { 
        "boost":1, 
        "query":"ing" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_middle": { 
        "boost":1, 
        "query":"ing" 
        } 
       } 
      }, 
      { 
       "text": { 
        "productName.partial_back": { 
        "boost":1, 
        "query":"ing" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

Le principali modifiche che ho dovuto fare sarebbe quella di spostare l'impostazione dalle mappature PUT per la creazione dell'indice. Ho anche spostato la definizione di mappatura iniziale qui, ma potrebbe essere stata creata utilizzando il PUT regolare/index/item/_mapping.

Se uno qualsiasi dei pro elasticsearch vogliono espandere questa per i futuri lettori di questo problema si prega di fare.

+0

Accetterò questa risposta in quanto risolve il mio problema specifico, ma per favore, chiunque possa aggiungere e rendere questa risposta migliore, per favore fallo! – Rockstar04

Problemi correlati