2015-04-21 10 views
5

Sto usando ElasticSearch tramite NEST C#. Ho ampio elenco di informazioni sulle personeOrdine ElasticSearch per lunghezza stringa

{ 
    firstName: 'Frank', 
    lastName: 'Jones', 
    City: 'New York' 
} 

mi piacerebbe essere in grado di filtrare e ordinare questo elenco di articoli per lastName così come fine per la lunghezza in modo da persone che hanno solo 5 caratteri nel loro nome sarà essere all'inizio del set di risultati quindi persone con 10 caratteri.

Quindi, con qualche pseudo codice mi piacerebbe fare qualcosa di simile list.wildcard("j*").sort(m => lastName.length)

Sono nuovo di elasticsearch in modo che qualsiasi esempi possono essere super disponibile.

risposta

5

È possibile effettuare lo smistamento con script-based sorting.

Come esempio giocattolo, ho creato un indice di banale con alcuni documenti:

PUT /test_index 

POST /test_index/doc/_bulk 
{"index":{"_id":1}} 
{"name":"Bob"} 
{"index":{"_id":2}} 
{"name":"Jeff"} 
{"index":{"_id":3}} 
{"name":"Darlene"} 
{"index":{"_id":4}} 
{"name":"Jose"} 

allora posso ordinare i risultati della ricerca in questo modo:

POST /test_index/_search 
{ 
    "query": { 
     "match_all": {} 
    }, 
    "sort": { 
     "_script": { 
     "script": "doc['name'].value.length()", 
     "type": "number", 
     "order": "asc" 
     } 
    } 
} 
... 
{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 4, 
     "max_score": null, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "1", 
      "_score": null, 
      "_source": { 
       "name": "Bob" 
      }, 
      "sort": [ 
       3 
      ] 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "4", 
      "_score": null, 
      "_source": { 
       "name": "Jose" 
      }, 
      "sort": [ 
       4 
      ] 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "2", 
      "_score": null, 
      "_source": { 
       "name": "Jeff" 
      }, 
      "sort": [ 
       4 
      ] 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "3", 
      "_score": null, 
      "_source": { 
       "name": "Darlene" 
      }, 
      "sort": [ 
       7 
      ] 
     } 
     ] 
    } 
} 

Per filtrare in base alla lunghezza, posso utilizzare un script filter in modo simile:

POST /test_index/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "script": { 
       "script": "doc['name'].value.length() > 3", 
       "params": {} 
      } 
     } 
     } 
    }, 
    "sort": { 
     "_script": { 
     "script": "doc['name'].value.length()", 
     "type": "number", 
     "order": "asc" 
     } 
    } 
} 
... 
{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 3, 
     "max_score": null, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "4", 
      "_score": null, 
      "_source": { 
       "name": "Jose" 
      }, 
      "sort": [ 
       4 
      ] 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "2", 
      "_score": null, 
      "_source": { 
       "name": "Jeff" 
      }, 
      "sort": [ 
       4 
      ] 
     }, 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "3", 
      "_score": null, 
      "_source": { 
       "name": "Darlene" 
      }, 
      "sort": [ 
       7 
      ] 
     } 
     ] 
    } 
} 

Ecco il codice che ho usato:

http://sense.qbox.io/gist/22fef6dc5453eaaae3be5fb7609663cc77c43dab

P.S .: Se uno qualsiasi degli ultimi nomi conterrà spazi, si potrebbe desiderare di utilizzare "index": "not_analyzed" su quel campo.

+2

Diciamo che esegue questa ricerca spesso, su molti documenti, varrebbe la pena indicizzare solo la lunghezza? – Robin

+0

Sì, sicuramente, se questa è un'opzione. Buon punto –

+0

Grazie per l'ottimo feedback. @Robin: per la maggior parte i miei dati non cambieranno in modo da indicizzare la lunghezza che ritengo sarebbe utile. Se hai qualche riferimento puoi indicarmi che sarebbe fantastico. – mvcNewbie