#solr
#solr
Вопрос:
Итак, я пытаюсь создать пользовательское поле в моей схеме Solr, которое фильтруется и обрабатывается определенным образом, но, похоже, это не работает.
<fieldType name="removeWhitespace" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.TrimFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory" pattern="s" replacement="" replace="all" />
</analyzer>
</fieldType>
<field name="whiteSpaceRmved" type="removeWhitespace" stored="true" indexed="true"/>
<copyField source="original" dest="whiteSpaceRmved"/>
В принципе, если у меня есть поле, подобное,
Hello World
Я хочу иметь это поле и новое имя поля, которое выглядит как,
HelloWorld
Но когда я пытаюсь это сделать, оно копирует поле, но никак не изменяет его. Есть идеи?
Ответ №1:
Вам нужно переместить токенизатор <tokenizer class="solr.StandardTokenizerFactory" />
в конец цепочки анализаторов. В настоящее время значения полей разбиваются на токены, прежде чем вы удалите пробелы. И на самом деле, поскольку вы удаляете пробелы, вам может даже не понадобиться токенизатор, поскольку, похоже, вы действительно хотите сохранить значения в виде строк.
Комментарии:
1. Спасибо! Мне было интересно, если я хочу, чтобы поле было сокращено, это правильный синтаксис? Причина, по которой я спрашиваю, заключается в том, что, когда я выполняю запрос Solr и получаю результирующий XML-ответ, в значении поля, заполненном пробелами, пробелы не удаляются. Это так же, как поле дублируется. В принципе, действительно ли использование copyField выполняет анализаторы при копировании из другого поля?
2. Согласно вашему разговору об ответе @Jayendra. Solr не сохраняет поле в том виде, в каком к нему применили анализаторы, независимо от того, вставлено ли оно как исходное поле или с помощью команды copyfield. Если вы действительно хотите сохранить значение поля (например, возвращаемое значение из индекса) в другом формате, вам нужно будет выполнить форматирование данных перед вставкой их в индекс.
Ответ №2:
Вам следует использовать KeywordTokenizer, который фактически не выполняет токенизацию, поэтому вся входная строка сохраняется как один токен
<fieldType name="removeWhitespace" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.TrimFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory"
pattern="(s)" replacement="" replace="all"
/>
</analyzer>
</fieldType>
Комментарии:
1. Если вы видите мой комментарий к Paige ниже, результирующий XML по-прежнему не применяет НИ ОДИН из фильтров к результатам. Он просто копирует его слово в слово без изменений. Я даже не уверен, можно ли что-то применить к скопированному полю?
2. Это индексированное значение, а не сохраненное значение. Таким образом, у вас не было бы возврата HelloWorld как части ответа. ответ всегда будет возвращать вам Hello World. Анализ не влияет на сохраненное значение. Он просто обрабатывает то, что должно быть проиндексировано.
3. Есть ли способ принудительно изменить сохраненное значение таким образом? Я думаю, вопрос получше, допустим, у меня есть индексы и анализаторы запросов, когда я выполняю запрос для Hello World, идеальным случаем является то, что запрос становится hello_world, и что при поиске через Solr он натыкается на поле с пробелами и получает точное совпадение с hello_world, когда сохраненное значение равно Hello World. Из того, что вы сказали, это то, что должно произойти, если я вас правильно понял?
4. ДА. Анализ обычно выполняется как во время индексации, так и во время запроса, так что термины преобразуются как во время запроса, так и во время индекса для получения соответствия. Сохраненные значения являются незатронутыми терминами.