Elasticsearch. Как остановить множественное число, оканчивающееся на es?

#elasticsearch

#elasticsearch

Вопрос:

Для языка EN у меня есть пользовательский анализатор, использующий porter_stem . Я хочу, чтобы запросы со словами «вирус» и «вирусы» возвращали одинаковые результаты.

Я обнаружил, что портер использует virus-> viru и viruses-> virus. Следовательно, я получаю разные результаты.

Как я могу справиться с этим?

Ответ №1:

Вы можете добиться своего варианта использования, то есть запросы со словами «вирус» и «вирусы» должны возвращать тот же результат, используя фильтр токенов snowball, который сводит все слова к их корневому слову.

Добавление рабочего примера с индексными данными, сопоставлением, поисковым запросом и результатом поиска

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

 {
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_snow"
          ]
        }
      },
      "filter": {
        "my_snow": {
          "type": "snowball",
          "language": "English"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "desc": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}
 

Анализ API

 GET /_analyze

{
  "analyzer" : "my_analyzer",
  "text" : "viruses"
}
 

Генерируются следующие токены —

 {
  "tokens": [
    {
      "token": "virus",
      "start_offset": 0,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}
 

Индексировать данные:

 {
    "desc":"viruses"
}
{
    "desc":"virus"
}
 

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

 {
  "query": {
    "match": {
      "desc": {
        "query": "viruses"
      }
    }
  }
}
 

Результат поиска:

 "hits": [
      {
        "_index": "65707743",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.18232156,
        "_source": {
          "desc": "viruses"
        }
      },
      {
        "_index": "65707743",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.18232156,
        "_source": {
          "desc": "virus"
        }
      }
    ]
 

Комментарии:

1. Спасибо. Как можно увидеть данные индекса?

2. @BenderRodriguez вы хотите видеть все проиндексированные данные? Для этого вы можете использовать запрос сопоставить все elastic.co/guide/en/elasticsearch/reference/current /…

3. Я хочу видеть, например, что когда оно происходит от слова «вирус», оно получает «viru» — где оно хранит это слово и другие слова, которые были получены. Спасибо.