эластичный поиск в нижнем регистре, например% term% search - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий путь к файлу, который мне нужно сохранить в ES:

/mnt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg

Я бы хотел найти следующее и получить совпадение:

search = "qf episodic sg_1001 JPG"

И получить совпадение, другими словами, это будет поиск, подобный следующему в (моем) sql:

select * from table where fp like '%qf%' and fp like '%episodic%' 
and fp like '%sg_1001%' and fp like '%jpg%'

Два вопроса здесь:

  1. Как правильно сохранить это в моем индексе? Тока у меня есть самое основное (и неправильное) поле ключевого слова -

    body = {
            "mappings": {
                "_doc": {
                    "dynamic": "strict",
                    "properties": {
                        "path":        {"type": "keyword"},
                    }
                }
            }
    }
    

  1. Каким будет правильный способ поиска вышеуказанного в ES? Ток у меня -

    "query": {
      "bool": {
        "must": [
          { "match": { "fp": "qf" } },
          { "match": { "fp": "episodic" } },
          { "match": { "fp": "sg_1001" } },
          { "match": { "fp": "JPG" } }
        ]
      }
    }
    

1 Ответ

0 голосов
/ 01 ноября 2018

Допустим, ваш ввод такой:

/mnt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg

Что я собираюсь сделать, так это преобразовать все эти forward slash и underscore в whitespaces

Таким образом, ваш вклад выглядел бы теперь как

mnt qfs-X Asset_Management XG Marketing Episodic-SG 1001 1233.jpg

Использование токенайзера standard вместе с token_filter(standard and lowercase) ниже будет списком слов, которые вы, наконец, будете иметь, которые в конечном итоге будут сохранены в вашем инвертированном индексе и которые могут быть запрошены.

mnt qfs X asset management xg marketing episodic sg 1001 1233 jpg

Ниже приведен пример сопоставления и запроса для вышеупомянутого:

Отображение

PUT mysampleindex
{  
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_analyzer":{  
               "tokenizer":"standard",
               "char_filter":[  
                  "my_char_filter"
               ],
               "filter":[  
                  "standard",
                  "lowercase"
               ]
            }
         },
         "char_filter":{  
            "my_char_filter":{  
               "type":"pattern_replace",
               "pattern":"\\/|_",
               "replacement":" "
            }
         }
      }
   },
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "mytext":{  
               "type":"text",
               "analyzer":"my_analyzer"
            }
         }
      }
   }
}

Образец документа

POST mysampleindex/mydocs/1
{
  "mytext": "nt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg"
}

Пример запроса

POST mysampleindex/_search
{  
   "query":{  
      "match":{  
         "mytext":"qfs episodic sg 1001 jpg"
      }
   }
}

Имейте в виду, что когда вы отправляете вышеуказанный запрос в Elasticsearch, Elasticsearch будет принимать входные данные и применять там также Анализ времени поиска . Я бы посоветовал вам прочитать эту ссылку для получения дополнительной информации об этом, и именно поэтому вы получите документ даже с приведенной ниже строкой запроса.

"mytext": "QFS EPISODIC SG 1001 jpg"

Теперь, если вы попытаетесь выполнить поиск, используя pisodic (e pisodic ), то есть приведенный ниже запрос в качестве примера, поиск ничего не даст, потому что ваш инвертированный индекс не сохраняет слова в этом мода. Для таких сценариев я бы предложил вам использовать N-Gram Tokenizer , чтобы episodic дополнительно создавал такие слова, как episodi, pisodic, которые сохранялись бы в инвертированном индексе.

POST mysampleindex/_search
{  
   "query":{  
      "match":{  
         "mytext":"pisodic"
      }
   }
}

Также обратите внимание, что я использовал text, а не keyword тип данных. Надеюсь, это поможет!

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