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/