Как выполнить частичный поиск и получить соответствующую оценку в Elasticsearch - PullRequest
1 голос
/ 06 августа 2020

Я новичок в Elasticsearch, пытаюсь выполнить поиск. У меня есть имена таких объектов, как:

Homework
work
jobroles
jobs

Я использую запрос с подстановочными знаками, но его возвращаемая оценка составляет 1,0 для каждого документа.

Мне нужна оценка на основе того, насколько хорошо он соответствует. Пример

Пример. Если я наберу

работа

score of work > homework

1 Ответ

1 голос
/ 07 августа 2020

Это хороший вопрос, и напрямую вы не можете получить точное совпадение сверху, вам нужен анализатор ngram, который предоставляет частичные совпадения, и другое поле, в котором хранятся точные токены в нижнем регистре (текстовое поле со стандартным анализатором решит это ).

Я воспроизвел вашу проблему и решил ее, используя вышеупомянутый подход. Пожалуйста, обратитесь к мой блог об автозаполнении и мой этот SO-ответ для более глубокого чтения различных автозаполнений / частичных поисков и почему / что / как его часть.

Рабочий пример

Создание сопоставления индексов

{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 10
        }
      },
      "analyzer": {
        "autocomplete": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    },
    "index.max_ngram_diff" : 10
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "autocomplete", 
        "search_analyzer": "standard" 
      },
      "title_lowercase" :{
        "type" : "text"
      }
    }
  }
}

Проиндексируйте образцы документов

{
  "title" : "Homework",
  "title_lowercase" : "Homework"
}   

{
  "title" : "work",
  "title_lowercase" : "work"
}

Поисковый запрос

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "work"
            }
          }
        },
        {
          "match": {
            "title_lowercase": {
              "query": "work"
            }
          }
        }
      ]
    }
  }
}

И ожидаемый результат

 "hits": [
      {
        "_index": "internaledge",
        "_type": "_doc",
        "_id": "1",
      "_score": 0.9926754, /note score of `work` is much higher than`homework`
        "_source": {
          "title": "work",
          "title_lowercase": "work"
        }
      },
      {
        "_index": "internaledge",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.2995283,
        "_source": {
          "title": "Homework",
          "title_lowercase": "Homework"
        }
      }
    ]
...