Scoring by term position in ElasticSearch?

后端 未结 2 1421
Happy的楠姐
Happy的楠姐 2020-12-05 15:53

I\'m implementing an auto-complete index in ElasticSearch and have run into an issue with sorting/scoring. Say I have the following strings in an index:

appl         


        
2条回答
  •  北海茫月
    2020-12-05 16:22

    You can do a custom sorting, like this:

    {
      "query": {
        "match": {
          "content": "donut"
        }
      },
      "sort": {
        "_script": {
          "script": "termInfo=_index['content'].get('donut',_OFFSETS);for(pos in termInfo){return _score+pos.startOffset};",
          "type": "number",
          "order": "asc"
        }
      }
    }
    

    In there I just returned the startOffset. If you need something else, play with those values and the original scoring and come up with a comfortable value for your needs.

    Or you can do something like this:

    {
      "query": {
        "function_score": {
          "query": {
            "match": {
              "content": "donut"
            }
          },
          "script_score": {
            "script": "termInfo=_index['content'].get('donut',_OFFSETS);for(pos in termInfo){return pos.startOffset};"
          },
          "boost_mode": "replace"
        }
      },
      "sort": [
        {
          "_score": "asc"
        }
      ]
    }
    

    In either case you need in your mapping for that specific field to have this:

    "content": {
      "type": "string",
      "index_options": "offsets"
    }
    

    meaning index_options needs to be set to offsets. Here more details about this.

提交回复
热议问题