ElasticSearch按字符串长度排序

我正在通过NEST c#使用ElasticSearch。我有很多关于人的信息

{

firstName: 'Frank',

lastName: 'Jones',

City: 'New York'

}

我希望能够按lastName以及长度的顺序对项目列表进行过滤和排序,因此名称中只有5个字符的人会出现在结果集的开头,然后是10个字符的人。

所以我想用一些伪代码做类似的事情 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

如果任何姓氏包含空格,则可能要"index":

"not_analyzed"在该字段上使用。

以上是 ElasticSearch按字符串长度排序 的全部内容, 来源链接: utcz.com/qa/434718.html

回到顶部