Função de busca retornando resultados aproximados?

Olá.

Eu estava pesquisando sobre este tópico no meu fórum: les passants - Autour d'une roue - Monocycle.info

O título do tópico é “les passants”

Antes, pesquisar com “passants in:title” retornava este tópico entre os primeiros resultados.

Mas agora, ele exibe resultados aproximados:

Em vez de “passants”, você verá “passe”, “pass”, “passage”, “passion”, algumas dessas palavras antes mesmo da string exata “passants”…

Eu suponho que isso seja um bug?

Receio não saber o suficiente sobre a Pesquisa para saber se isso é intencional ou não, mas você pode adicionar aspas duplas em volta de uma palavra para torná-la uma pesquisa exata, se isso ajudar?

Por exemplo. "passants"

1 curtida

Isso certamente ajuda, mas o comportamento padrão é intrigante.

Por um motivo desconhecido, ao pesquisar a string exata com aspas duplas, ele também retorna um resultado que não tem “passants” no título (mas tem no conteúdo do primeiro post):

1 curtida

Em francês, passants é reduzido ao léxico pass antes de pesquisarmos o conteúdo das postagens.

Um léxico é uma string, assim como um token, mas foi normalizado para que diferentes formas da mesma palavra se tornem iguais.

4 curtidas

Entendido.

Os lexemas estão relacionados ao idioma?

Não acho que faça muito sentido em francês reduzir uma palavra assim para “pass”. :thinking: Isso é mais confuso do que útil, considerando que há muitas palavras que começam com “pass” sem estarem (direta ou indiretamente) relacionadas ao verbo “passer”.

Mas se pudermos segmentar a string exata com aspas duplas em vez disso, já resolve :slight_smile:.

Além disso, o que aconteceu com o segundo resultado que não tinha “passants” no título, apesar de eu ter usado aspas duplas na minha última captura de tela?

Essas coisas são configuráveis no Postgres, mas a implementação francesa no Postgres é o que reduz tudo isso:

discourse_development=# select to_tsvector('french', 'passants');
 to_tsvector
-------------
 'pass':1
(1 row)

discourse_development=# select to_tsvector('english', 'passants');
 to_tsvector
-------------
 'passant':1
(1 row)

Existem dicionários mais sofisticados que podem ser usados, mas eles são extremamente complicados de configurar.

3 curtidas