Невозможно выполнить полнотекстовый поиск в Solr - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть некоторые данные в solr. Я хочу найти, какое имя Chinmay Sahu См. Ниже, у меня 3 результата на выходе. Но я получил 3 вместо 1. Потому что контент name частично искал.

Я хочу выполнить полный поиск по имени, имеющему Chinmay Sahu только то, что придет содержимое.

Выход:

"docs": [
      {
        "id": "741fde46a654879949473b2cdc577913",
        "content_id": "1277",
        "name": "Chinmay Sahu",
        "_version_": 1596995745829879800
      },
      {
        "id": "4e98d680efaab3afe051f3ddc00dc5f2",
        "content_id": "1825",
        "name": "Chinmay Panda",
        "_version_": 1596995745829879800
      }
      {
        "id": "741fde46a654879949473b2cdc577913",
        "content_id": "1259",
        "name": "Sasmita Sahu",
        "_version_": 1596995745829879800
      }
]

Запрос:

name:Chinmay Sahu

Ожидаемый:

"docs": [
      {
        "id": "741fde46a654879949473b2cdc577913",
        "content_id": "1277",
        "name": "Chinmay Sahu",
        "_version_": 1596995745829879800
      },
]

Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Я бы предложил использовать запрос как

name:(Chinmay Sahu)

и убедиться, что оператор по умолчанию AND в настройках или в строке запроса, например q.op=AND

СПри таком подходе пользовательский ввод можно использовать намного проще, так как вам не нужно слишком много его разбирать.

0 голосов
/ 26 апреля 2018

Поскольку root545 уже объяснил, что field:foo bar будет искать foo в field и bar в поле поиска по умолчанию, я полагаю, что вам не нужно беспокоиться о точном Lucene синтаксис для поиска. Парсер запросов edismax хорошо подходит для отделения типизированной строки поиска от полей, в которых выполняется поиск, и от того, хотите ли вы, чтобы все токены совпадали.

Запрос в этом случае будет просто Chinmay Sahu, в то время как вы установите q.op=AND (все термины должны совпадать), defType=edismax (используйте синтаксический анализатор запросов edismax) и qf=name (поиск в поле имени) :

q=Chinmay Sahu&q.op=AND&defType=edismax&qf=name

Вы также можете настроить различные параметры фразы, чтобы убедиться, что имена с токенами в той же самой последовательности будут увеличены выше, чем те, у которых они есть в противоположной последовательности (т. Е. Саху Чинмай).

Если это программный поиск, когда ни один пользователь фактически не набирает в предложении, использование поиска фразы, как предложено, является подходящим способом (name:"Chinmay Sahu").

0 голосов
/ 26 апреля 2018

Попробуйте сделать это

name:"Chinmay Sahu"

Вам необходимо выполнить запрос фразы, чтобы найти точное имя.

Я предполагаю, что в вашем случае в поле имени используется стандартный токенайзер, который разделит токены, если есть пробел. Поэтому при индексации во всех 3 документах будет присутствовать токен под названием "chinmay".

При поиске с использованием

name:Chinmay Sahu

Solr будет искать его следующим образом, поскольку если имя поля не указано, прежде чем токен solr автоматически выполнит его поиск в default_field. (Однако поле по умолчанию удаляется из solr 7.3, поэтому это зависит от того, какую версию solr вы используете. )

Name:chinmay AND default_field:sahu

Таким образом, поскольку все три документа имеют в качестве токена в индексе chinmay, запрос будет соответствовать всем 3 документам.

Теперь я не знаю, какое у вас поле по умолчанию? Вы можете опубликовать свою схему Solr? Таким образом, мы можем объяснить, почему вы видите эти 3 документа.

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