Elasticsearch - документ лучше оценивать, когда больше слов соответствует - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблема, и я надеюсь, что кто-нибудь может мне помочь.

У меня есть простой пример поиска с запросом на совпадение

"query": {
    "match": {
        "filterValues": "ordner ohne griffloch"
    }
}

Я получил ровно два обращения:

"hits" : [
  {
    "_index" : "filters",
    "_type" : "filter",
    "_id" : "F-114150068-1170182",
    "_score" : 5.420828,
    "_source" : {
      "filterValues" : [
        "Ja",
        "Griffloch vorhanden",
        "Griffloch",
        "mit Griffloch"
      ]
    },
    "highlight" : {
      "filterValues" : [
        "<em>Griffloch</em>"
      ]
    }
  },
  {
    "_index" : "filters",
    "_type" : "filter",
    "_id" : "F-114150069-1170182",
    "_score" : 4.452639,
    "_source" : {
      "filterValues" : [
        "ohne Griffloch",
        "kein Griffloch",
        "Nein"
      ]
    },
    "highlight" : {
      "filterValues" : [
        "<em>ohne Griffloch</em>"
      ]
    }
  }
]

Моя проблема в том, что я хочу найти второй удар "ohne Griffloch" в качестве первого (лучший результат), потому что он соответствует большему количеству слов.Но я нахожу первый с лучшим счетом, я думаю, потому что он содержит чаще "Griffloch".

Я не могу использовать запрос термина, потому что тогда я ничего не найду, потому что он неточно соответствует чему угодно, когда запрос содержит другие слова (здесь: "ordner").

Есть какие-нибудь идеи?

Спасибо!

За информацию о конфигурации индекса:

"settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        },
        "lowercase_shingle": {
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "my_shingle"
          ]
        }
      },
      "filter": {
        "my_shingle": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 4
        }
      }
    }
  },
  "mappings": {
    "filter": {
      "properties": {
        "filterValueId": {
          "type": "long"
        },
        "filterValues": {
          "type": "text",
          "position_increment_gap": 100,
          "analyzer": "default",
          "search_analyzer": "lowercase_shingle"
        },
        "categoryId": {
          "type": "long"
        }
      }
    }
  }

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я решил, используя запрос оценки функции с пользовательским сценарием безболезненно.

Этот сценарий становится полным поисковым термином и выполняет 2 действия: Установите оценку на основе длины значения (поэтому здесь«ohne griffloch» больше, чем «griffloch», так что лучше).

Вторая (необязательная, но для меня хорошая) вещь заключается в том, что она использует позицию значения в тексте.

Мне нужно было удалить массив значений и поместить каждое значение в индекс как один документ.

"functions": [
              {

                "script_score": {
                  "script": {
                    "source": "def v=doc['filterValue'].value; def score = 10000; score += v.length(); score -= \"ordner ohne griffloch\".indexOf(v)*50;",
                    "lang": "painless"
                  }
                }
              }
            ],
            "score_mode": "multiply",
            "boost_mode": "replace",
            "max_boost": 3.4028235e+38,
            "boost": 1
          }

  }
0 голосов
/ 18 декабря 2018

Вы должны добавить повышение соответствия фраз в вашем запросе.Таким образом, документ, в котором все условия вашего запроса находятся в одном из нескольких значений filterValues, будет естественно увеличен.

Но вам нужно остерегаться этой причуды ( см. Здесь, официальный документ )

Я не знаю как (возможно, сила с вами), но ваше отображениеуже правильно для position_increment_gap, но вы должны удалить настройку

search_analyzer ":" lowercase_shingle "

, поскольку это кажется немного странным в вашем контексте.

Затем мы добавим повышение к фразе совпадения

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "filterValues": "ordner ohne griffloch"
                    }
                }
            ],
            should: [
              {
                "match_phrase": {
                        "filterValues": {
                          "query": "ordner ohne griffloch",
                          "slop": 10 
                        }

                    }
                }
            ]
        }
    }
}

Надеюсь, что это сработает!

РЕДАКТИРОВАТЬ после комментария:

Если вы измените свое отображение, добавив подпунктполе с вашим shingle_analyzer в индексное время

"mappings": {
    "filter": {
      "properties": {
        "filterValueId": {
          "type": "long"
        },
        "filterValues": {
          "type": "text",
          "position_increment_gap": 100,
          "analyzer": "default",
          "search_analyzer": "lowercase_shingle",
          "fields": {
              "shingled": {
                   "type": "text",
                   "analyzer": "lowercase_shingle",
              }
          }
        },
        "categoryId": {
          "type": "long"
        }
      }
    }
  }

Затем вы можете добавить усиление в подполяемое подполе с помощью этого запроса

{
        "query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "filterValues": "ordner ohne griffloch"
                        }
                    }
                ],
                should: [
                  {
                    "match": {
                            "filterValues.shingled": "ordner ohne griffloch" 
                        }
                    }
                ]
            }
        }
    }

В вашем примере это увеличит второй документ, а непервый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...