【问题标题】:Elastic search sorting results of individual queries inside should bool query内部单个查询的弹性搜索排序结果应该 bool 查询
【发布时间】:2020-02-29 17:16:09
【问题描述】:

我有一个 Elastic Search 服务器设置,其中存储了用于公司搜索的公司名称,它的工作方式是:

从公司名称中,空格和点将被删除并存储在 ES 中名为 trimmedcompanyname 的字段中,

{
          "companyName" : "RECKON INFOSYSTEM PRIVATE LIMITED",
          "trimmedCompanyName" : "reckoninfosystemprivatelimited",
          "id" : "1079"
}

现在当搜索到我的服务器时,我删除空格和点,然后向 ES 服务器发出请求。查询格式的ES请求为:

GET /_search
{
   "from": 0,"size":1000,
    "query": {
      "bool": {
      "should": [
        {
          "wildcard": {
            "trimmedCompanyName.keyword": {
              "value": "infosys*"
            }
          }
        },
        {
          "wildcard": {
            "trimmedCompanyName.keyword": {
              "value": "*infosys*"
            }
          }
        }
      ]
    }
    }
}

现在这给出了结果

[
      {
        "_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"
        }
      }
 ]

但我希望结果为

[
      {
        "_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"
        }
      }
  ]

即结果,各个通配符查询的 o/p 必须在它们之间进行排序,但第一个通配符查询的 o/p 应该在第二个通配符查询的 o/p 之前。有人可以帮我解决这个问题吗?

【问题讨论】:

标签: sorting elasticsearch


【解决方案1】:

我得到了解决方案,根据搜索分数和 trimmedcompanyname 进行排序。我的最终查询是:

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"}
    }
  ]
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 2020-06-05
    • 2021-02-10
    • 2017-10-22
    • 2018-09-20
    • 1970-01-01
    • 2021-07-12
    • 2020-06-15
    相关资源
    最近更新 更多