Я пытаюсь найти термин, в котором есть пробелы и подстановочный знак в конце; т.е. name:John S*
Solr не может вернуть какой-либо результат, хотя у меня есть перечисленные ниже записи и они возвращаются при запросе *:*
из веб-интерфейса Solr;
- Джон Доу
- Джонни Инглиш
- Джон Смит
Я использую Sol7.4 с DIH, который индексирует мою БД, и я создаю функцию поиска контактов (по имени и телефону) для моего веб-приложения.
Я подписался на эту тему Solr подстановочный запрос с пробелами однако это не решило проблему;
- Я попытался изменить тип моего поля (для поля
name
) на text_en
, text_ws
, и в настоящее время text_general
, плюс, попытался экранировать пробел с обратной косой чертой "\", но это не сработало.
- Tried Solr " синтаксический анализатор сложных фраз ", который частично решил проблему, поскольку это значительно увеличит время запроса, кроме того, Solarium выдает исключение, если термин содержит пробелы в конце, т.е. "jhon \ *", и если я пытаюсь выполнить тот же запрос из веб-интерфейса Solr, я не получаю результата
http://localhost:8983/solr/collection/select?q{!complexphrase inOrder=true}displayName:John\ *
- Также попробовал Префикс парсера запросов без удачи
Примечание: , что я перезагружал solr, очищал и переиндексировал свои данные после каждой попытки.
Ожидаемый результат:
при поиске "John" я должен получить все 3 записи:
- Джон Доу
- Джонни Инглиш
- Джон Смит
при поиске «Джона», который будет анализироваться на «Джона»; Я должен получить:
и при поиске "John \ S *" я должен получить:
Обновление # 1
search.php
...
$term = str_replace(' ', '\ ', $request_params['term']);
$query->setQuery('phone:"%1%" OR name:"%1%" OR contact:%2%*', [$request_params['term'], $term]);
// $query->setQuery('phone:"%1%" OR name:"%1%" OR contact:"%2%*"', [$request_params['term'], $term]);
...
управляемая схема
...
<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
...
<field name="name" type="text_general" multiValued="false" indexed="true" stored="true"/>
<field name="contact" type="lowercase" indexed="true" stored="true"/>
<field name="phone" type="string" docValues="false" multiValued="false" indexed="true" required="true" stored="true"/>
<copyField source="displayName" dest="card"/>
<!-- <copyField source="phone" dest="card"/> -->
...