问题
I have a Elastic Search server setup where am storing company names to be used for for company search, the way it works is:
From company name, spaces and dots will be removed and stored in ES in a field called trimmedcompanyname,
{
"companyName" : "RECKON INFOSYSTEM PRIVATE LIMITED",
"trimmedCompanyName" : "reckoninfosystemprivatelimited",
"id" : "1079"
}
now when search comes to my server i remove the spaces and dots and then make request to ES server. The ES request in query format is:
GET /_search
{
"from": 0,"size":1000,
"query": {
"bool": {
"should": [
{
"wildcard": {
"trimmedCompanyName.keyword": {
"value": "infosys*"
}
}
},
{
"wildcard": {
"trimmedCompanyName.keyword": {
"value": "*infosys*"
}
}
}
]
}
}
}
Now this gives the result as
[
{
"_source" : {
"companyName" : "INFOSYS LIMITED",
"trimmedCompanyName" : "infosyslimited"
}
,
{
"_source" : {
"companyName" : "INFOSYSTEM BPO LIMITED",
"trimmedCompanyName" : "infosysbpolimited"
}
},
{
"_source" : {
"companyName" : "INFOSYS ASIC SYSTEMS",
"trimmedCompanyName" : "infosysasicsystems"
}
},
{
"_source" : {
"companyName" : "SUMEDH INFOSYSTEMS PRIVATE LIMITED",
"trimmedCompanyName" : "sumedhinfosystemsprivatelimited"
}
},
{
"_source" : {
"companyName" : "ASSURE INFOSYSTEMS PRIVATE LIMITED",
"trimmedCompanyName" : "assureinfosystemsprivatelimited"
}
},
{
"_source" : {
"companyName" : "IMBIBE INFOSYSTEM PRIVATE LIMITED",
"trimmedCompanyName" : "imbibeinfosystemprivatelimited"
}
},
{
"_source" : {
"companyName" : "GOOFY INFOSYSTEM PRIVATE LIMITED",
"trimmedCompanyName" : "goofyinfosystemprivatelimited"
}
},
{
"_source" : {
"companyName" : "DHRUV INFOSYSTEMS PRIVATE LIMITED",
"trimmedCompanyName" : "dhruvinfosystemsprivatelimited"
}
}
]
But i want the result as
[
{
"_source" : {
"companyName" : "INFOSYS ASIC SYSTEMS",
"trimmedCompanyName" : "infosysasicsystems"
}
},
{
"_source" : {
"companyName" : "INFOSYSTEM BPO LIMITED",
"trimmedCompanyName" : "infosysbpolimited"
}
},
{
"_source" : {
"companyName" : "INFOSYS LIMITED",
"trimmedCompanyName" : "infosyslimited"
}
,
{
"_source" : {
"companyName" : "ASSURE INFOSYSTEMS PRIVATE LIMITED",
"trimmedCompanyName" : "assureinfosystemsprivatelimited"
}
},
{
"_source" : {
"companyName" : "DHRUV INFOSYSTEMS PRIVATE LIMITED",
"trimmedCompanyName" : "dhruvinfosystemsprivatelimited"
}
},
{
"_source" : {
"companyName" : "GOOFY INFOSYSTEM PRIVATE LIMITED",
"trimmedCompanyName" : "goofyinfosystemprivatelimited"
}
},
{
"_source" : {
"companyName" : "IMBIBE INFOSYSTEM PRIVATE LIMITED",
"trimmedCompanyName" : "imbibeinfosystemprivatelimited"
}
},
{
"_source" : {
"companyName" : "SUMEDH INFOSYSTEMS PRIVATE LIMITED",
"trimmedCompanyName" : "sumedhinfosystemsprivatelimited"
}
}
]
i.e. in the result, o/p of individual wildcard queires must be sorted among themselves but o/p of first wildcard query should precede o/p from second wildcard query. Can someone please help me with this?
回答1:
I got the solution, sorting on search score as well as trimmedcompanyname. My final query is:
GET /_search
{
"from": 0,"size":1000,
"query": {
"bool": {
"should": [
{
"wildcard": {
"trimmedCompanyName.keyword": {
"value": "infosys*"
}
}
},
{
"wildcard": {
"trimmedCompanyName.keyword": {
"value": "*infosys*"
}
}
}
]
}
},
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"trimmedCompanyName.keyword": {"order": "asc"}
}
]
}
Hope it helps!
来源:https://stackoverflow.com/questions/60467698/elastic-search-sorting-results-of-individual-queries-inside-should-bool-query