-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Corrigir indexação de título de artigo em que há aspas + dois pontos #26
Comments
Essa atividade foi realizado no passado, porém gerou impactos não esperado.... Irei realiza outra abordagem para resolver esse problema. |
Para resolver essa atividade de forma elegante e utilizando de recurso que o próprio indexador oferece, realizei uma pesquisa de como resolver a partir do Solr, já que sabemos que é possível realizar tratamentos nos texto e garantir que a pesquisa seja realizada por "tokens" que possam tratar caracteres especiais. Verificando no nosso arquivo de configuração do Solr, temos o seguinte: <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType> Veja que contém um arquivo de com stopwords e verificando nesse arquivo existe o termo "Quem", "se" o que faz com que a pesquisa não realize o casamento com a busca "Quem não se comunica se trumbica". Primeira ação é comentar linha do stopwords. Mesmo com essa comentário a pesquisa ainda não funciona, já que estamos com um caracter aspas curvas: “” Inicialmente foi utilizado um filtro a indexação e na pesquisa para garantir que somente letras e números fossem pesquisaveis Algo assim: <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!--filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /-->
<filter class="solr.PatternReplaceCharFilterFactory" pattern="^[a-zA-Z0-9]+$" replacement=""/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!--filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /-->
<filter class="solr.PatternReplaceCharFilterFactory" pattern="^[a-zA-Z0-9]+$" replacement=""/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType> Porém dessa forma os caracteres acentuados são removidos e ASCIIFoldingFilterFactory passa a não funcionar. Importante: O ASCIIFoldingFilterFactory é um filtro que converte os caracteres acentuado em seu respectivo caracter da tabela ASCII, portanto esse filtro garante que "á" seja traduzido para "a", o que garante que possamos pesquisa por "passaro" ou "pássaro". Pesquisando mais um pouco... descobri que podemos fazer uma troca dos caracteres especiais do Lucene por espaço no momento de indexação e pesquisa. Os caracteres especiais do Lucene são: **+ - && || ! ( ) { } [ ] ^ " ~ * ? : **, utilizando PatternReplaceCharFilterFactory (https://solr.apache.org/guide/6_6/charfilterfactories.html#CharFilterFactories-solr.PatternReplaceCharFilterFactory) é possível no campo de pesquisa padrão o conhecido df (default field) é possível realizar essas trocar por ""(vazio) e garantir que com ou sem esses caracteres especiais a pesquisa seja retornada. Para garantir que esteja funcionado foi realizado alguns teste, veja: Repare no analisador que os caracteres especiais estão fora do casamento tanto para o campo indexado quando para o campo pesquisado. Agora com somente uma parcela dos termos: Pesquisando com um acento em qualquer dos caracteres: Pesquisando com aspas retas: Pesquisando com aspas curvas: Pesquisando com somente um termos chave para esse registro "trumbica": Reparem que o formato dos campos de título não foram alterados: Para realizar esse testes foi necessário realizar a indexação de um mês especifico para ter o registro com o ID: S1808-24322023000100221-scl Comando para indexação do mês e ano especifico:
Por fim e não menos importante a alteração no arquivo de definição do Solr: <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern='[+\-|!(){}\[\]^"~*?:\/\\“”]' replacement=""/>
<!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> -->
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern='[+\-|!(){}\[\]^"~*?:\/\\“”]' replacement=""/>
<!-- <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> -->
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
</analyzer>
</fieldType> |
Para garantir que isso seja utilizado por todos os registros é necessário uma reindexação completa do índice. |
…eciais do Lucene seja encontrados Mais detalhes sobre essa atividade é possível no seguinte tíquete: scieloorg/search-journals-proc#26 (comment)
Descrição do problema
No artigo http://www.scielo.br/scielo.php?script=sci_arttext&pid=S1808-24322023000100221&lang=pt, há o termo trumbica, mas ao buscá-lo com a seguinte expressão:
comunica trumbica
ouQuem não se comunica se trumbica
, não retorna nenhum resultado.Comportamento esperado
.
Screenshots ou vídeos
.
Anexos
.
Ambiente utilizado
.
The text was updated successfully, but these errors were encountered: