Солр:Использование фрагментатора Regex для извлечения абзацев

StackOverflow https://stackoverflow.com/questions/364301

  •  21-08-2019
  •  | 
  •  

Вопрос

Я разместил это сообщение в списке рассылки Solr, но попробую и здесь, на случай, если поблизости скрывается эксперт Solr.

Я пытаюсь использовать фрагментатор регулярных выражений, и мне трудно получить желаемые результаты.Я пытаюсь получить фрагменты, начинающиеся с символа слова и заканчивающиеся знаками препинания, но по какой-то причине возвращаемые мне фрагменты кажутся очень негибкими, несмотря на то, что я предоставил большую отстойность.Вот соответствующие параметры, которые я использую, возможно, кто-то поможет указать, где я ошибся:

<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>

Это должно соответствовать 400–600 символам, начиная со слова и заканчивая одним из .!?.Вот пример типичного результата:

.Посмотрите эти фотографии.Девять новичков Panda выставлены впервые в четверг на юго -западе Китая.Им меньше года.Они только недавно прекратили уход за больными.В горных лесах центрального Китая осталось только 1600 человек, еще 120 на китайских объектах размножения и зоопарков.И им около 20, которые живут за пределами Китая в зоопарках.Они существуют почти полностью на бамбуке.Они могут дожить до 30 лет.И эти маленькие парни в конечном итоге станут намного больше.Они вырастут

Как видите, оно начинается с точки и заканчивается символом слова!Это почти как если бы фрагменты просто выходили такими, какими они должны быть, а регулярное выражение вообще ничего не делает, но результаты отличаются, когда я использую фрагментатор пробелов.В приведенном выше результате я не вижу причин, по которым не следовало бы удалить предыдущую точку и последние два слова: в помоях и в шаблоне регулярного выражения достаточно места.Помогите, пожалуйста, разобраться, что я делаю не так...

Большое спасибо,

Отметка

Это было полезно?

Решение

Пытаться:

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

Вам не нужны первые квадратные скобки вокруг \w

И вам следует избежать последней точки.

И я не думаю .* непосредственно перед другим квантором ({400,600}) — хорошая идея, поэтому .{400,600}

С ? — это специальный символ в регулярном выражении, его также следует экранировать.

И с тех пор . соответствует чему угодно, вам лучше использовать [^\.!\?] чтобы соответствовать чему-либо но ваши конечные персонажи.

Другие советы

Я никогда не слышал об инструменте, с которым вы работаете (Solr), но квантификаторы в вашем регулярном выражении определенно неверны.Это регулярное выражение будет соответствовать от 402 до 602 символов, где первый — это словесный символ, а последний — один из трех символов пунктуации:

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

Точка и вопросительный знак не являются метасимволами внутри класса символов, поэтому нет смысла экранировать их.\w может стоять сам по себе.

Поскольку точка также соответствует трем символам пунктуации, ваше регулярное выражение будет соответствовать как можно большему количеству символов (до 602), а затем вернет результат, чтобы убедиться, что последний является одним из трех ваших символов пунктуации.

Если вы хотите отдать приоритет более коротким прогонам, используйте ленивый квантификатор:

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

Если вы хотите, чтобы ваше регулярное выражение соответствовало только одному предложению, используйте отрицательный класс символов:

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

Все вышесказанное предполагает, что Solr использует регулярные выражения в стиле Perl.Такие вещи, как \w и {400,600}, работают не во всех вариантах регулярных выражений.

Кажется, возникла проблема, если вы используете WordDelimiterFilterFactory.Проблема описана здесь http://www.mail-archive.com/solr-user@lucene.apache.org/msg30631.html

Как описано в ссылке выше, одним из решений может быть добавление preserveOriginal="1" на ваш WordDelimiterFilterFactory.Я попробовал это, и это сработало для меня.Однако (будучи новичком в SOLR) я не знаю, есть ли какие-либо недостатки у этого подхода (кроме увеличения размера индекса).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top