2016-05-25 33 views
5

Sto cercando di eseguire simili interrogazione campo in elasticsearch:Ricerca elasticsearch campo contenuto in un valore di

select * from products where 'milk' like '%'+name+'%'

Significato Sto cercando di trovare tutti i documenti che il nome del prodotto, in questo caso è un sotto stringa di "latte".

Come posso farlo?

+0

Si prega di leggere [la documentazione] (https: //www.el astic.co/guide/en/elasticsearch/guide/current/partial-matching.html). –

+0

Non sono sicuro di come possa essere d'aiuto Non ho bisogno: testo LIKE "% quick%", ho bisogno del contrario (vedi la domanda –

+0

Puoi elaborare un esempio. Qualcosa come 3 documenti con i nomi dei prodotti: abcmilkman, abcman, un uomo, ecc. Vuoi i primi 2 documenti da restituire come risultato? Se è così, allora la query sql sembra un po 'off, voglio dire non dovrebbe essere 'select * dai prodotti dove' product_name 'like' % '+ latte +'% ''? Oppure ho sbagliato tutto –

risposta

5

Vorrei andare con un analizzatore personalizzato sfruttando ngrams. In primo luogo creare un indice in questo modo:

curl -XPUT 'localhost:9200/tests' -d ' 
{ 
    "settings" : { 
     "analysis" : { 
      "analyzer" : { 
       "my_analyzer" : { 
        "tokenizer" : "ngrams" 
       } 
      }, 
      "tokenizer" : { 
       "ngrams" : { 
        "type" : "nGram", 
        "min_gram" : "2", 
        "max_gram" : "10" 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "test": { 
      "properties": { 
       "product_name": { 
        "type": "string", 
        "analyzer": "standard", 
        "search_analyzer": "my_analyzer" 
       } 
      } 
     } 
    } 
}' 

Poi è possibile indicizzare alcuni dati:

curl -XPOST 'localhost:9200/tests/test/_bulk' -d ' 
{"index":{}} 
{"product_name": "bc"} 
{"index":{}} 
{"product_name": "cd"} 
{"index":{}} 
{"product_name": "def"} 
' 

E, infine è possibile cercare in questo modo:

curl -XPOST 'localhost:9200/tests/_search' -d '{ 
    "query": { 
     "match": { 
      "product_name": "abcde" 
     } 
    } 
}' 

e si otterrà il primo due documenti bc e cd

+0

Grazie, è esattamente quello che stavo cercando. –

+0

Fantastico, felice che abbia aiutato! – Val

+1

mi picchiato lol @Val –