Запрос Solr, дающий неправильные результаты, ищет строку из нескольких слов (разделенных пробелом) - PullRequest
0 голосов
/ 03 мая 2018

Я проиндексировал следующий документ в Solr с помощью имя_приложения - строка из нескольких слов, например, "Проверка огня",

{
    "app_name":"Fire inspection",
    "appversion":1,
    "id":"app_1397_version_2417",
    "icon":"/images/media/default_icons/app.png",
    "type":"app",
    "app_id":1397,
    "account_id":556,
    "app_description":"fire inspection app",
    "_version_":1599441252925833216}]
}

если я выполняю следующий запрос Solr, Solr возвращает неправильный ответ,

Запрос:

http://localhost:8983/solr/AxoSolrCollectionLocal/select?fq=app_name:*fire P*&q=*:*

Я ищу записи, чье app_name содержит "fire P", но получаю -response, чье app_name содержит "fire exam". Здесь строка «Fire P» не совпадает с приведенной ниже записью, но все равно на нее отвечает Solr.

Response:
{
    "app_name":"Fire inspection",
    "appversion":1,
    "id":"app_1397_version_2417",
    "icon":"/images/media/default_icons/app.png",
    "type":"app",
    "app_id":1397,
    "account_id":556,
    "app_description":"fire inspection app",
    "_version_":1599441252925833216}]
}

Может кто-нибудь помочь мне с запросом Solr (таким же, как и в аналогичном запросе в SQL), который проверит наличие подстроки и пробелы не будут иметь значения.

Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 03 мая 2018

Во-первых, ваш запрос не означает, что вы думаете, что это значит. app_name:*fire P* означает «поиск всего, заканчивающегося fire в поле app_name и / или всего, начинающегося с p в поле поиска по умолчанию». Поскольку вы не поставили перед вторым значением префикс имени поля, будет использоваться поле поиска по умолчанию.

Если вы хотите найти совпадение подстроки внутри поля, подобного этому (т.е. что-то, что содержит «огонь P» в качестве подстроки внутри значения, тип поля должен быть сделан строковым полем - или поле с ключевым словом tokenizer - таким образом поле сохраняет свое фактическое значение, и оно не обрабатывается / не фильтруется / токенизируется далее. Если оно токенизировано, эти токены (т. е. fire, inspection и т. д.) будут храниться отдельно. правильно заполнить пробелы и выполнить запрос к одному полю (т. е. имя_приложения: fire \ P `), и в зависимости от варианта использования производительность может снизиться, если только у вас не включен ReversedWildcardFilter.

Тем не менее, вы также можете использовать ComplexPhraseQueryParser для получения поддержки wilcards в запросах фраз:

{!complexphrase inOrder=true}app_name:"*fire P*"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...