# Question regarding Sorts

**URL:** <https://discuss.elastic.co/t/question-regarding-sorts/138018>\
**Category:** Elasticsearch\
**Created:** [June 29, 2018, 6:05pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018 "2018-06-29T18:05:16Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [June 29, 2018, 6:05pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/1 "2018-06-29T18:05:16Z")

</div>

Hello guys!

I have a question regarding to sorts, the scenario i have is following:  
I m creating a list of sort on one field with different custom sorting scripts, so eventually it looks like:  
sorts: [  
script: {}, # sort 1 (Strict match)  
script: {}, # sort 2 (prefix match)  
script: {} # sort 3 (more loose condition match)  
]

The goal i want to achieve is that 1 should be used if could be, otherwise fall back to sort2, sort3.

But what i seeing is that even the we have the `exact match` docs based on user's query, the order does not working as I expect, am i not doing it correctly/how should i achieve my goal?

Thanks

---

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [July 24, 2018, 7:25pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/2 "2018-07-24T19:25:43Z")

</div>

Anyone has insights regarding this question?

---

<div class="post-metadata">

**Author:** ![ddorian43](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ddorian43/32/36093_2.png) [@ddorian43](https://discuss.elastic.co/u/ddorian43)\
**Post date:** [July 25, 2018, 5:27pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/3 "2018-07-25T17:27:40Z")

</div>

I'm assuming the 3 scripts get's used as 3 fields. Did you try having all the logic into 1 script ?

---

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [July 25, 2018, 5:51pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/4 "2018-07-25T17:51:57Z")

</div>

Hello!

Thanks for your response.

I haven't tried merging those 3 into one sort yet. Just wondering what's the recommend way to achieve what i described there.

What do you mean by get's used as 3 fields?

---

<div class="post-metadata">

**Author:** ![ddorian43](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ddorian43/32/36093_2.png) [@ddorian43](https://discuss.elastic.co/u/ddorian43)\
**Post date:** [July 26, 2018, 9:22am UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/5 "2018-07-26T09:22:45Z")

</div>

Paste exact query that you send, what you wrote isn't valid.

---

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [July 26, 2018, 2:43pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/6 "2018-07-26T14:43:37Z")

</div>

sorts: [  
\_script: {  
type: string,  
script: {  
lang: painless,  
source: if (doc[params.fieldName] != null) { def strValue = doc[params.fieldName].value; def lc =  
strValue.toLowerCase(); if (lc.equals(params.prefix)) { return 0; }}return 1;  
params: {  
fieldName: "a"  
},  
}  
order: asc  
},  
\_script: {  
type: string,  
script: {  
lang: painless,  
source: if (doc[params.fieldName] != null) { def strValue = doc[params.fieldName].value; def lc =  
strValue.toLowerCase(); if (lc.startsWith(params.prefix)) { return 0; }}return 1;  
params: {  
fieldName: "a"  
}  
},  
order: asc  
},  
\_script: {  
type: string,  
script: {  
lang: painless,  
source:def value = '';for (String fieldName : params.fieldNames) { if (doc[fieldName] != null) { if  
(!value.isEmpty()) { value += ' '; } value += String.valueOf(doc[fieldName].value); }}return value;  
params: {  
fieldName: "a"  
}  
},  
order: asc  
}  
]

@ddorian43 Please take a look, the sorting i want to achieve here is that based on doc's field 'a',  
try exact match first, if not, fall back to prefix, if still not, back to last one

---

<div class="post-metadata">

**Author:** ![ddorian43](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ddorian43/32/36093_2.png) [@ddorian43](https://discuss.elastic.co/u/ddorian43)\
**Post date:** [July 26, 2018, 3:07pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/7 "2018-07-26T15:07:54Z")

</div>

Please put it inside ```` tags.  
Try to change it into 1 big script that does conditional return.

---

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [July 26, 2018, 3:19pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/8 "2018-07-26T15:19:23Z")

</div>

Could you explain why this one doesn't work? is it because the later sort override the previous one?

---

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [July 26, 2018, 3:20pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/9 "2018-07-26T15:20:35Z")

</div>

And apologies for not formatting, trying to get use to this

---

<div class="post-metadata">

**Author:** ![ddorian43](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ddorian43/32/36093_2.png) [@ddorian43](https://discuss.elastic.co/u/ddorian43)\
**Post date:** [July 26, 2018, 4:04pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/10 "2018-07-26T16:04:13Z")

</div>

read how `sort` works on documentation. See `nulls first/last` and `missing`. Basically it sorts by 3 values together. So they are always sorted by `script` then `script2` then `script3`.

---

<div class="post-metadata">

**Author:** ![XiaoConstantine](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/xiaoconstantine/32/33092_2.png) [@XiaoConstantine](https://discuss.elastic.co/u/XiaoConstantine)\
**Post date:** [July 26, 2018, 6:18pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/11 "2018-07-26T18:18:27Z")

</div>

@ddorian43 I see, so it behaves in an overriding fashion now. I will try to merge those 3 scripts into one and give it a shot. Thanks!

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [August 23, 2018, 6:18pm UTC](https://discuss.elastic.co/t/question-regarding-sorts/138018/12 "2018-08-23T18:18:32Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
