elasticsearch 如何按匹配词的顺序对结果集进行排序,elasticsearch,search,elasticsearch,Search" /> elasticsearch 如何按匹配词的顺序对结果集进行排序,elasticsearch,search,elasticsearch,Search" />

elasticsearch 如何按匹配词的顺序对结果集进行排序

elasticsearch 如何按匹配词的顺序对结果集进行排序,elasticsearch,search,elasticsearch,Search,如何按匹配词的顺序对结果集进行排序 我有几个词“heinz meyer” 我的查询返回: 亨氏A.迈耶 Heinz Meyer股份有限公司Heizung Sanitär 海因茨·迈耶 卡尔·海因茨·迈耶股份有限公司 但我需要,按匹配的位置排序,如下一步: 海因茨·迈耶 Heinz Meyer股份有限公司Heizung Sanitär 亨氏A.迈耶 卡尔·海因茨·迈耶股份有限公司 我的问题是: { "query": { "bool": {

如何按匹配词的顺序对结果集进行排序

我有几个词“heinz meyer”

我的查询返回:

  • 亨氏A.迈耶
  • Heinz Meyer股份有限公司Heizung Sanitär
  • 海因茨·迈耶
  • 卡尔·海因茨·迈耶股份有限公司
但我需要,按匹配的位置排序,如下一步:

  • 海因茨·迈耶
  • Heinz Meyer股份有限公司Heizung Sanitär
  • 亨氏A.迈耶
  • 卡尔·海因茨·迈耶股份有限公司
我的问题是:

    {
        "query": {
            "bool": {
                "must": [{
                    "wildcard": {
                        "name": "heinz*"
                    }
                }, {
                    "wildcard": {
                        "name": "meyer*"
                    }
                }],
                "must_not": [],
                "should": [],
                "filter": {
                    "bool": {
                        "must": [{
                            "range": {
                                "latestRevenueStatistics.revenue": {
                                    "gte": "0",
                                    "lte": "40000000"
                                }
                            }
                        }, {
                            "range": {
                                "latestRevenueStatistics.number_of_employees": {
                                    "gte": "0",
                                    "lte": "300"
                                }
                            }
                        }, {
                            "term": {
                                "addresses.postal_code_length": 5
                            }
                        }]
                    }
                }
            }
        },
        "from": 0,
        "size": 10
    }
最终解决方案:

{
    "query": {
        "bool": {
            "must": [{
                "wildcard": {
                    "name": "heinz*"
                }
            }, {
                "wildcard": {
                    "name": "mayer*"
                }
            }, {
                "span_near": {
                    "clauses": [{
                        "span_term": {
                            "name": {
                                "value": "heinz"
                            }
                        }
                    }, {
                        "span_term": {
                            "name": {
                                "value": "mayer"
                            }
                        }
                    }],
                    "slop": 4,
                    "in_order": true
                }
            }],
            "must_not": [],
            "should": [{
                "span_first": {
                    "match": {
                        "span_term": {
                            "name": "heinz"
                        }
                    },
                    "end": 1
                }
            }, {
                "span_first": {
                    "match": {
                        "span_term": {
                            "name": "mayer"
                        }
                    },
                    "end": 2
                }
            }],
            "filter": {
                "bool": {
                    "must": [{
                        "range": {
                            "latestRevenueStatistics.revenue": {
                                "gte": "0",
                                "lte": "40000000"
                            }
                        }
                    }, {
                        "range": {
                            "latestRevenueStatistics.number_of_employees": {
                                "gte": "0",
                                "lte": "300"
                            }
                        }
                    }, {
                        "term": {
                            "addresses.postal_code_length": 5
                        }
                    }]
                }
            }
        }
    },
    "from": 0,
    "size": 10
}

可以使用、和的组合实现匹配查询

为了简单起见,我创建了一个示例索引,其中只包含一个标记为
name
类型的字段以及以下文档

文件: 查询: 您可以继续并将上述查询添加到现有的查询中

希望这有帮助

POST sortindex/_doc/1
{
  "name": "Heinz A. Meyer"
}

POST sortindex/_doc/2
{
  "name": "Heinz Meyer GmbH Heizung-Sanitär"
}

POST sortindex/_doc/3
{
  "name": "Heinz Meyer"
}

POST sortindex/_doc/4
{
  "name": "Karl-Heinz Meyer GmbH"
}
POST sortindex/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "span_near": {               <---- Span Near Query
            "clauses": [
              {
                "span_term": {         <---- Span Term Query
                  "name": {
                    "value": "heinz"
                  }
                }
              },
              {
                "span_term": {
                  "name": {
                    "value": "meyer"
                  }
                }
              }
            ],
            "slop": 4,                 <---- Retrieve all docs having both heinz and meyer with distance of <= 4 words
            "in_order": true           <---- Heinz must always come before Meyer 
          }     
        }
      ],
      "should": [
        {
          "span_first": {              <---- Span First Query
            "match": {
              "span_term": {           <---- Span Term Query
                "name": "heinz"
              }
            },
            "end": 1                   <----  Retrieve docs having heinz's postition <= 1 and > 0 i.e. the first word
          }
        }
      ]
    }
  }
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 0.38327998,
    "hits" : [
      {
        "_index" : "sortindex",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.38327998,
        "_source" : {
          "name" : "Heinz Meyer"
        }
      },
      {
        "_index" : "sortindex",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.26893127,
        "_source" : {
          "name" : "Heinz Meyer GmbH Heizung-Sanitär"
        }
      },
      {
        "_index" : "sortindex",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.25940484,
        "_source" : {
          "name" : "Heinz A. Meyer"
        }
      },
      {
        "_index" : "sortindex",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 0.19908611,
        "_source" : {
          "name" : "Karl-Heinz Meyer GmbH"
        }
      }
    ]
  }
}