Skip to content
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

Open
robertatakenaka opened this issue Mar 21, 2024 · 4 comments
Assignees

Comments

@robertatakenaka
Copy link
Member

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 ou Quem não se comunica se trumbica, não retorna nenhum resultado.

Captura de Tela 2024-03-21 às 10 54 29

Comportamento esperado

.

Screenshots ou vídeos

.

Anexos

.

Ambiente utilizado

.

@gitnnolabs
Copy link
Contributor

Essa atividade foi realizado no passado, porém gerou impactos não esperado....

Irei realiza outra abordagem para resolver esse problema.

@gitnnolabs
Copy link
Contributor

Testando novamente o artigo do exemplo realmente não é apresentado:

Image

@gitnnolabs
Copy link
Contributor

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:

Image

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:

Image

Pesquisando com um acento em qualquer dos caracteres:

Image

Pesquisando com aspas retas:

Image

Pesquisando com aspas curvas:

Image

Pesquisando com somente um termos chave para esse registro "trumbica":

Image

Reparem que o formato dos campos de título não foram alterados:

Image

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:

python updatesearch/metadata.py -c scl  --from_date 2023-07-01 --until_date 2023-07-31

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>

@gitnnolabs
Copy link
Contributor

Para garantir que isso seja utilizado por todos os registros é necessário uma reindexação completa do índice.

@robertatakenaka robertatakenaka removed their assignment Feb 5, 2025
gitnnolabs added a commit to gitnnolabs/search-journals that referenced this issue Feb 5, 2025
…eciais do Lucene seja encontrados

Mais detalhes sobre essa atividade é possível no seguinte tíquete:
scieloorg/search-journals-proc#26 (comment)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants