我正在通过NEST c#使用ElasticSearch。我有很多关于人的信息
{ firstName: 'Frank', lastName: 'Jones', City: 'New York' }
我希望能够按lastName以及长度的顺序对项目列表进行过滤和排序,因此名称中只有5个字符的人会出现在结果集的开头,然后是10个字符的人。
所以我想用一些伪代码做类似的事情 list.wildcard("j*").sort(m => lastName.length)
list.wildcard("j*").sort(m => lastName.length)
我是ElasticSearch的新手,所以任何示例都将非常有帮助。
您可以使用基于脚本的排序进行排序。
作为一个玩具示例,我用一些文档建立了一个琐碎的索引:
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"}
然后,我可以订购这样的搜索结果:
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 ] } ] } }
要按长度过滤,我可以通过类似的方式使用脚本过滤器:
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 ] } ] } }
这是我使用的代码:
http://sense.qbox.io/gist/22fef6dc5453eaaae3be5fb7609663cc77c43dab
PS: 如果任何姓氏包含空格,则可能要"index": "not_analyzed"在该字段上使用。
"index": "not_analyzed"