2016-02-15 3 views
0

Я пытаюсь использовать PostgreSQL для реализации полнотекстовой поисковой системы.Postgres full text search ignore url

Я встречаюсь с этим странным или может быть предназначен для этого.

При попытке индексирования или поиска столбца, который содержит имена файлов с расширением (например, myimage.jpg), система рассматривает его как URL-адрес и не делает его соответствующим образом символизированным.

Я ссылался на документацию и вижу, что через ts_debug имя файла принимается в качестве хоста url.

Может ли кто-нибудь сказать, как принимать все входы как нормальное слово в FTS от PostgreSQL.

Также, по второму запросу, как можно сделать contains, startswith и endswith выполняет поиск?

Update

я сейчас попробовал заявление create text search configuration..., скопированное из pg_catalog.english и удален host, url и url_path, а затем уточнил конфигурацию для метода ts_debug. Но все равно нет. myimage.jpg по-прежнему идентифицирован как host.

Версия Я использую версию 9.4

ответ

0

TL; др Посмотрите предварительно разборе ввод и удаление знаков препинания, если вы действительно хотите только слова (а не электронную почту, адреса, хосты, и т.д.).

Поэтому, пытаясь понять это, проблема заключается в том, что вы, похоже, не в состоянии легко настроить парсер. По моему мнению, сначала выполняется синтаксический анализатор, который генерирует токены. Затем эти жетоны сопоставляются со словарями.

Удаляя host, url, url_path из конфигурации все, что вы делаете, это делает его таким образом, чтобы эти маркеры не получить посмотрел в словаре, в результате чего не лексемы из этих маркеров. Это, по сути, означает, что они не существуют с точки зрения поиска. Что не хочу, чтобы вы хотите ...

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

Единственным решением для этого было бы предварительно проанализировать текст, чтобы удалить полную остановку. Обратите внимание, что если вы полагаетесь на другие типы токенов вроде версии (например, 8.3.0) или электронную почту (например, [email protected]), это нарушит их. Таким образом, вам может потребоваться немного умнее, как вы удаляете символы.

select ts_debug('english', replace('this-is-a-file.jpg', '.', ' ')); 

"(asciihword,"Hyphenated word, all ASCII",this-is-a-file,{english_stem},english_stem,{this-is-a-fil})" 
"(hword_asciipart,"Hyphenated word part, all ASCII",this,{english_stem},english_stem,{})" 
"(blank,"Space symbols",-,{},,)" 
"(hword_asciipart,"Hyphenated word part, all ASCII",is,{english_stem},english_stem,{})" 
"(blank,"Space symbols",-,{},,)" 
"(hword_asciipart,"Hyphenated word part, all ASCII",a,{english_stem},english_stem,{})" 
"(blank,"Space symbols",-,{},,)" 
"(hword_asciipart,"Hyphenated word part, all ASCII",file,{english_stem},english_stem,{file})" 
"(blank,"Space symbols"," ",{},,)" 
"(asciiword,"Word, all ASCII",jpg,{english_stem},english_stem,{jpg})" 

С точки зрения вашего второго вопроса. Вы говорите о частичных матчах слов?Вы получаете это немного, когда используете конфигурацию, например english, поэтому running становится run, который будет соответствовать, если вы ищете run или running. Если вы говорите о нечетком совпадении, это становится немного сложнее. Я предлагаю прочитать эту статью http://rachbelaid.com/postgres-full-text-search-is-good-enough/

Смежные вопросы