首页 > 解决方案 > 弹性搜索。如何获得命中的“_score”字段?

问题描述

我有以下代码:

export const getUserIds = async (search) => {
  const requestBody = {
    query_string: {
      query: `*${search}*`,
      fields: [
        `firstName^${FIELD_PRIORITIES.FIRSTNAME}`,
        `lastName^${FIELD_PRIORITIES.LASTNAME}`,
        `username^${FIELD_PRIORITIES.USERNAME}`,
      ],
    },
  };
  const resultOfElastic = await client.search({
    ...ES_CONFIG.INDEX,
    ...ES_CONFIG.USER.TYPE,
    body: {
      query: requestBody,
    },
    size: 1000,
  });
  const orderedHits = _.orderBy(resultOfElastic.hits.hits, ['_score', 'desc']);
  return orderedHits.map((user) => stringToObjectId(user._id));
};

因为 ES 不对字段的结果进行排序,所以_score我需要在代码中进行。ElasticSearch 的结果是resultOfElastic.hits.hits并且每个命中都有_score字段。我尝试使用 Lodash 按 排序命中_score,但没有任何反应。如何按字段对命中进行排序_score

标签: javascriptnode.jselasticsearch

解决方案


您可以使用 bool 查询在 _sort 的基础上进行排序

{
    "from": 0,
    "size": 50,
    body: {
      query: {
        bool: {
          must: [{

              match:{
                 "firstName":${FIELD_PRIORITIES.FIRSTNAME}`,
                 "lastName":${FIELD_PRIORITIES.LASTNAME}`,
                 "username":${FIELD_PRIORITIES.USERNAME}`,
              } 
          }, ],
          should: [{
            match:{
              "meta": searchString
            } 
          }, ]

        },

      },
      sort: {
        _score  : {
          "order": "desc"
        }
      },

    }
  }

bool 的详细信息可以在这里找到


推荐阅读