#elasticsearch
#elasticsearch
Вопрос:
У меня есть схема такого типа в моем эластичном поиске:
{
"my_index": {
"mappings": {
"my_type": {
"properties": {
"mention_id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"mentions": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"score": {
"type": "long"
}
}
}
}
}
}
}
}
Данные хранятся в этом формате:
{
"_index": "globalmentionkb",
"_type": "globalmentionkb",
"_id": "ylWDd2kBUYncqPcTEE3d",
"_version": 1,
"_score": 1,
"_source": {
"mention_id": "GBMEN-19379",
"mentions": [
{
"name": " Mohatma Ghandi",
"score": 1
}
,
{
"name": " Biography of Mahatma Gandhi",
"score": 1
}
,
{
"name": " Svadeshi",
"score": 1
}
,
{
"name": " Gandhy",
"score": 1
}
,
{
"name": " Gandhi's work in South Africa",
"score": 1
}
,
{
"name": " Mohandas Gandhi",
"score": 1
}
,
{
"name": " Mahondas Gandhi",
"score": 1
}
,
{
"name": " Mahatama Ghandi",
"score": 1
}
,
{
"name": " Mahatman Gandhi",
"score": 1
}
,
{
"name": " Bapu Gandhi",
"score": 1
}
,
{
"name": " Mohandas Ghandi",
"score": 1
}
,
{
"name": " Mahatma Karamchand Gandhi",
"score": 1
}
,
{
"name": " મોહનદાસ કરમચંદ ગાંધી",
"score": 1
}
,
{
"name": " Gandhi",
"score": 1
}
,
{
"name": " Ghondi",
"score": 1
}
,
{
"name": " Little brown saint",
"score": 1
}
,
{
"name": " Mohandas KaramChand Gandhi",
"score": 1
}
,
{
"name": " Barrister mohandas karamchand gandhi",
"score": 1
}
,
{
"name": " Father of India",
"score": 1
}
,
{
"name": " Matahama Gandhi",
"score": 1
}
,
{
"name": " Mahâtmâ Gandhi",
"score": 1
}
,
{
"name": " Gandhi poppadom",
"score": 1
}
,
{
"name": " The little brown saint",
"score": 1
}
,
{
"name": " M.K. Gandhi",
"score": 1
}
,
{
"name": " Mohandus Ghandi",
"score": 1
}
,
{
"name": " M.K.Gandhi",
"score": 1
}
,
{
"name": " Mahatama Gandhi",
"score": 1
}
,
{
"name": " Mohandas K. Gandhi",
"score": 1
}
,
{
"name": " Mahatma Mohandas Karamchand Gandhi",
"score": 1
}
,
{
"name": " Mahatma gandhi",
"score": 1
}
,
{
"name": " M K Gandhi",
"score": 1
}
,
{
"name": " Gahndi",
"score": 1
}
,
{
"name": " Mahatma Ghadhi",
"score": 1
}
,
{
"name": " Gandhiji",
"score": 1
}
,
{
"name": " Mohandas K Gandhi",
"score": 1
}
,
{
"name": " Africian raga",
"score": 1
}
,
{
"name": " Gandhi, Mohandas K.",
"score": 1
}
,
{
"name": " M. K. Gandhi",
"score": 1
}
,
{
"name": " M. K. Ghandi",
"score": 1
}
,
{
"name": " MK Gandhi",
"score": 1
}
,
{
"name": " Mahatma Gandhi bibliography",
"score": 1
}
,
{
"name": " Ghandi",
"score": 1
}
,
{
"name": " Gandi's work in south africa",
"score": 1
}
,
{
"name": " Mohandas Karamchand Gandhi in South Africa",
"score": 1
}
,
{
"name": " Gnadhi",
"score": 1
}
,
{
"name": " Gandhi, Mohandas Karamchand",
"score": 1
}
,
{
"name": " Mahatma Ghandhi",
"score": 1
}
,
{
"name": " Gandhian Movement",
"score": 1
}
,
{
"name": " Mahatma Ghandi",
"score": 1
}
,
{
"name": " Putlibai",
"score": 1
}
,
{
"name": " Saint of Sabarmati",
"score": 1
}
,
{
"name": " Mohandas Karamchand Gandhi",
"score": 1
}
,
{
"name": " Mohandas Mahatma Gandhi",
"score": 1
}
]
}
}
теперь я хочу искать только те объекты, в которых упоминается имя «Ганди».
{
"query": {
"term": {
"mentions.name": "Gandhi"
}
}
}
тогда он выдает null
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": [ ]
}
}
даже если у нас есть данные.
можете ли вы сказать мне, что я должен сделать, чтобы получить точный термин из моего эластичного поиска.
Ответ №1:
Похоже, вы используете стандартный анализатор, который по умолчанию использует фильтр маркеров «в нижнем регистре».
Таким образом, термина нет Gandhi
, должен работать только gandhi
этот запрос:
{
"query": {
"term": {
"mentions.name": "gandhi"
}
}
}
Комментарии:
1. Это неверно. Анализатор по умолчанию также будет применен во время запроса.
Gandhi
иgandhi
должен возвращать тот же ответ. Эта ссылка elastic.co/guide/en/elasticsearch/reference/current /… упоминает , что по умолчанию запросы будут использовать анализатор, определенный в сопоставлении полей, но это можно переопределить с помощью параметра search_analyzer: что означает, что если анализатор не упоминается в сопоставлении, будет учитываться анализатор по умолчанию, то есть Стандартный анализатор, и я полагаю, что то же самое будет применяться и во время запроса.2. @Kamal, это верно, анализатор применяется и во время поиска, но
not for term query
— он применяется для запроса соответствия. Запрос term соответствует точным терминам.3. О, я понимаю, извините, я неправильно истолковал это как
match
запрос. Вы правы 🙂4. господа, мы все пропустили пробел перед Ганди. У меня есть «Ганди», но я думал «Ганди». Я удалил пробел перед Gandhi, теперь все работает нормально. спасибо за помощь.
5. @ArayanSingh на самом деле анализатор по умолчанию удаляет пробелы и переводит все в нижний регистр перед сохранением терминов, поэтому похоже, что вы используете другой анализатор или другой запрос. Я рад, что вы нашли решение, но tbh это не решение вопроса, который опубликован выше.