Изменить порядок поиска на основе индекса слова - PullRequest
0 голосов
/ 03 мая 2020

Есть ли способ добавить вес к терминам, найденным в начале документа? Например, у меня есть 3 документа.

Medicine XXX
Sulpher This medicine contains sulpher and should be taken only after consultation with your doctor.

Medicine YYY
contains: sulpher Not recommended by most physicians

Medicine ZZZ
This medicine works like sulpher but does not contain sulpher at all.

Документ XXX должен быть указан вверху для поискового запроса "Sulpher", потому что это первое слово в этом документе. Это нормально, если YYY указан вверху, потому что это то же самое, что XXX. Но ZZZ всегда должен быть последним. Другими словами, термины, найденные в «левой», должны иметь более высокий приоритет, чем термины в «правой» части документа.

1 Ответ

1 голос
/ 03 мая 2020

Вы можете увеличить на нормализованную позицию в нижнем регистре:

PUT sulphur
{
  "settings": {
    "analysis": {
      "normalizer": {
        "keyword_lowercase": {
          "type": "custom",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "keyword_lowercase"
          }
        }
      }
    }
  }
}

POST sulphur/_doc
{"text":"This medicine works like sulpher but does not contain sulpher at all."}
POST sulphur/_doc
{"text":"contains: sulpher Not recommended by most physicians"}
POST sulphur/_doc
{"text":"Sulpher This medicine contains sulpher and should be taken only after consultation with your doctor."}

, а затем

GET sulphur/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "function_score": {
            "query": {
              "match": {
                "text": "sulpher"
              }
            },
            "script_score": {
              "script": """
                def pos = doc['text.keyword'].value.indexOf('sulpher');
                return Math.exp((2.0/(pos+1)))
              """
            },
            "boost_mode": "replace"
          }
        }
      ]
    }
  }
}

, получив

[
  {
    "_index":"sulphur",
    "_type":"_doc",
    "_id":"sf5S2nEBW-D5QnrWODvB",
    "_score":7.389056,
    "_source":{
      "text":"Sulpher This medicine contains sulpher and should be taken only after consultation with your doctor."
    }
  },
  {
    "_index":"sulphur",
    "_type":"_doc",
    "_id":"sP5S2nEBW-D5QnrWNjtw",
    "_score":1.1993961,
    "_source":{
      "text":"contains: sulpher Not recommended by most physicians"
    }
  },
  {
    "_index":"sulphur",
    "_type":"_doc",
    "_id":"r_5S2nEBW-D5QnrWNDuw",
    "_score":1.079959,
    "_source":{
      "text":"This medicine works like sulpher but does not contain sulpher at all."
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...