Используя Solr 8.5, схему. xml:
<schema name="test" version="1.5">
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="text_syntax" type="text_tokenized_wildcard" indexed="true" stored="true" multiValued="false" required="true"/>
<field name="corpus" type="string" stored="true" indexed="true" multiValued="false" required="true"/>
<field name="event_timestamp" type="timestamp" stored="true" indexed="true" multiValued="false" required="false"/>
<copyField source="text" dest="text_syntax"/>
</fields>
<uniqueKey>id</uniqueKey>
<types>
<fieldType name="text_tokenized_wildcard" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="com.solr.custom.tokenizer.SentenceSearchTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="ё" replacement="е"/>
<filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" />
</analyzer>
<analyzer type="query">
<tokenizer class="com.solr.custom.tokenizer.SentenceSearchTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="ё" replacement="е"/>
</analyzer>
</fieldType>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="long" class="solr.LongPointField"/>
<fieldType name="timestamp" class="solr.DatePointField"/>
</types>
</schema>
Мне нужно искать фразы с синтаксисом (например, q = "* do stuff" должен выдавать "undo stuff", "redo stuff", "do stuff" et c), поэтому я использую defType = complexphrase .
http://localhost:8983/solr/test/select?fl=id corpus score&hl=on&hl.fl=text_syntax&df=text_syntax&defType=complexphrase&hl.snippets=32767&hl.maxAnalyzedChars=5000000&rows=30&inOrder=false&q="*do something"~1&hl.method=unified&hl.fragsize=100
Это дает хорошие результаты, однако каждое слово в ответе выделяется отдельно:
<em>do</em> <em>stuff</em>
<em>undo</em> <em>stuff</em>
...
Я бы хотел, чтобы фразы выделялись
<em>do stuff</em>
<em>undo stuff</em>
Я пытался:
- hl.method = unified - не работает, если только defType = edismax / dismax / standart, но эти парсеры мне не подходят
- hl.method = original , hl.mergeContiguous = true - тоже не Работа. Более того, hl.fragsize не работает должным образом (любое значение дает гигантские фрагменты)
- hl.method = fastVector - не работает
Any была бы признательна за помощь.