Pergunta

Eu postei esta mensagem na lista de discussão Solr, mas estou tentando aqui também no caso de haver um especialista em Solr rondando.

Eu estou tentando usar o fragmenter regex e estou tendo dificuldade em obter os resultados que eu quero. Eu estou tentando obter fragmentos que começam em um caractere de palavra e fim na pontuação, mas por alguma razão os fragmentos estão sendo devolvidos para mim parece ser muito inflexível, apesar de que eu forneci uma grande poça. Aqui estão os parâmetros relevantes que estou usando, talvez alguém possa ajudar a apontar onde eu tenho errado gone:

<str name="hl.fragsize">500</str>
<str name="hl.fragmenter">regex</str>
<str name="hl.regex.slop">0.8</str>
<str name="hl.regex.pattern">[\w].*{400,600}[.!?]</str>
<str name="hl">true</str>
<str name="q">chinese</str>

Isto deve ser correspondência entre 400-600 caracteres, começando com um caractere de palavra e terminando com um dos.!?. Aqui está um exemplo de um resultado típico:

. Confira essas fotos fora. panda Nine filhotes em exposição pela primeira vez Quinta-feira no sudoeste da China. Eles estão menos de um ano de idade. Eles apenas recentemente parou de enfermagem. tem apenas 1.600 desses caras deixados no florestas montanhosas da China central, outros 120 na reprodução chinês instalações e jardins zoológicos. E eles estão prestes 20 que vivem fora da China em zoológicos. Eles existem quase inteiramente no bambu. Eles podem viver até os 30 anos de idade. E esses caras pouco acabará por chegar Muito maior. Eles vão crescer

Como você pode ver, ela está começando com um período e terminando em um caractere de palavra! É quase como se os fragmentos são apenas saindo como eles vão eo regex não está fazendo nada, mas os resultados são diferentes quando eu uso o fragmenter lacuna. No resultado acima eu não vejo nenhuma razão pela qual não deveria ter retirados do período anterior e as duas últimas palavras, há espaço de sobra no tanque e no padrão regex. Por favor, me ajudar a descobrir o que estou fazendo errado ...

Muito obrigado,

Mark

Foi útil?

Solução

Tente:

\w[^\.!\?]{400,600}[\.!\?]

Você não deve precisar os primeiros colchetes ao redor \w

E você deve escapar o ponto final.

E eu não acho que .* apenas antes de outro quantificador ({400,600}) é uma boa idéia, daí o .{400,600}

Desde ? é um caractere especial em regex, você também deve escapar.

E desde . corresponde a qualquer coisa, você deve preferir usar [^\.!\?], a fim de corresponder a tudo e seus caracteres de final.

Outras dicas

Eu nunca ouvi falar da ferramenta que você está trabalhando com (Solr), mas os quantificadores em sua expressão regular está definitivamente errado. Este regex irá corresponder a entre 402 e 602 caracteres, onde o primeiro é um caractere de palavra, eo último é um dos três caracteres de pontuação:

\w.{400,600}[.!?]

O ponto e ponto de interrogação não são metacaracteres dentro de uma classe de caracteres, então não há nenhum ponto escapar-lhes. \ W pode ficar em sua própria.

Também desde o ponto coincide com os 3 caracteres de pontuação, o seu regex irá coincidir com o maior número de caracteres possível (até 602) e, em seguida, dar de volta para garantir que o último é um de seus 3 caracteres de pontuação.

Se você quiser priorizar tiragens menores, use um quantificador preguiçoso:

\w.{400,600}?[.!?]

Se você quer que seu regex para coincidir com apenas uma frase, use uma classe de caracteres negada:

\w[^.!?]{400,600}[.!?]

Todos os acima assume que Solr usa Perl-estilo expressões regulares. Coisas como \ w e {400600} não funcionam em todos os sabores de regex.

Parece haver um problema se você estiver usando um WordDelimiterFilterFactory. O problema é descrito aqui http: //www.mail- archive.com/solr-user@lucene.apache.org/msg30631.html

Como descrito no link acima, uma solução poderia ser a de adicionar preserveOriginal="1" ao seu WordDelimiterFilterFactory. Eu tentei isso e ele trabalhou para mim. No entanto, (sendo novo para SOLR) Eu não sei se existem desvantagens para esta abordagem (além de aumentar o tamanho do índice).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top