Elastic search sorting results of individual queries inside should bool query

[亡魂溺海] 提交于 2020-03-04 18:46:12

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!