Поиск Lucene не работает, когда я использую пробелы

Моя ситуация

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

Данные

У меня есть эти люди, созданные и находящиеся внутри моего индекса:

+---------------+------------+-------------+
| Person number | First name | Last name   |
+---------------+------------+-------------+
| 1             | Ilse       | Van de Burg |
| 2             | Devolder   | Marlijn     |
+---------------+------------+-------------+

Результаты поиска

Я пробовал следующие запросы:

+--------------+------------------+----------------+------------------+
| Query number | Term             | Actual result* | Accepted result* |
+--------------+------------------+----------------+------------------+
| 1            | van              | 1              | 1                |
| 2            | van de           | 1              | 1                |
| 3            | ilse             | 1              | 1                |
| 4            | van de burg      |                | 1                |
| 5            | van de burg ilse |                | 1                |
| 6            | de               | 1 & 2          | 1 & 2            |
| 7            | devolder         | 2              | 2                |
| 8            | devolder marlijn |                | 2                |
| 9            | marijn devolder  |                | 2                |
+--------------+------------------+----------------+------------------+
* number of the person. if empty: nothing found or accepted

Вопрос

Некоторые запросы не то, что я принял. Как я мог это решить?

Мой код

Вот мой код, который я сделал:

BaseSearchProvider searcher = ExamineManager.Instance.SearchProviderCollection["PersonSearcher"];
ISearchCriteria searchCriteria = searcher.CreateSearchCriteria(BooleanOperation.Or);
ISearchCriteria query = searchCriteria.Field("lastname", term.MultipleCharacterWildcard()).Or()
                                      .Field("firstname", term.MultipleCharacterWildcard()).Or()
                                      .OrderBy("lastname", "firstname").Compile();
return searcher.Search(query);

Конфигурации обновление 1

Просмотреть индекс

<IndexSet SetName="Artsen" IndexPath="~/App_Data/TEMP/ExamineIndexes/Artsen/">

  <IndexAttributeFields>
    <add Name="id" Type="int" />
    <add Name="nodeName" />
    <add Name="nodeTypeAlias" />
  </IndexAttributeFields>
  <IndexUserFields>
    <add Name="email" />
    <add Name="fax" />
    <add Name="naam" EnableSorting="true" />
    <add Name="onderzoeken" Type="int[]" />
    <add Name="specialismen" Type="int[]" />
    <add Name="subspecialismen" Type="int[]" />
    <add Name="telefoon" />
    <add Name="titel" EnableSorting="true" />
    <add Name="voornaam" EnableSorting="true" />
    <add Name="website" />
  </IndexUserFields>
  <IncludeNodeTypes>
    <add Name="arts" />
  </IncludeNodeTypes>
</IndexSet>

Проверить настройки (проверить поставщика индекса):

<add name="ArtsenIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine" supportUnpublished="false"
     supportProtected="true" indexSet="Artsen"
     analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/>

Проверить настройки (проверить поисковую систему):

<add name="ArtsenSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" supportUnpublished="false"
     supportProtected="false" indexSet="Artsen" enableLeadingWildcard="true"
     analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/>

Пробовал также обновление 2

Я также пробовал это и получил наилучшие результаты:

query = searchCriteria.GroupedOr(new List<string>() { "naam" }, term.MultipleCharacterWildcard(), term.Escape()).Or()
                      .GroupedOr(new List<string>() { "voornaam" }, term.MultipleCharacterWildcard(), term.Escape()).Or()
                      .GroupedOr(new List<string>() { "titel" }, term.MultipleCharacterWildcard(), term.Escape()).Or()
                      .OrderBy("naam", "voornaam").Compile();

Когда я выполняю ToString() из searchCriteria запроса выше и выполняю поиск по van de burg, это дает мне следующее:

{ SearchIndexType: , LuceneQuery: (naam:van de burg* (naam:van de burg)) (voornaam:van de burg* (voornaam:van de burg)) (titel:van de burg* (titel:van de burg)) }

Проблема здесь в том, что я получаю двух человек с одинаковой фамилией. Например:

+---------------+------------+-----------+
| Person number | First name | Last name |
+---------------+------------+-----------+
| 3             | Marc       | De Vadder |
| 4             | Freddy     | De vadder |
+---------------+------------+-----------+

Результаты поиска:

Все результаты с 1 по 9 хорошие.

+--------------+------------------+----------------+------------------+
| Query number | Term             | Actual result* | Accepted result* |
+--------------+------------------+----------------+------------------+
| 10           | de vadder        | 3 & 4          | 3 & 4            |
| 11           | de vadder freddy | 3 & 4          | 4                |
| 11           | de vadder marc   | 3 & 4          | 3                |
+--------------+------------------+----------------+------------------+
* number of the person. if empty: nothing found or accepted

person H. Pauwelyn    schedule 03.10.2017    source источник
comment
Пожалуйста, поделитесь также настройками вашего индекса и поисковика. Мы постараемся вам помочь :)   -  person Marcin Zajkowski    schedule 03.10.2017
comment
Подстановочные знаки недоступны во фразах и приводят к тому, что ваш запрос пропускает анализ. Вы, конечно, не нуждаетесь в них ни в одном из случаев, которые вы предоставили, поэтому просто вырежьте подстановочные знаки и попробуйте.   -  person femtoRgon    schedule 04.10.2017
comment
@MarcinZajkowski Я добавил их. Спасибо за ваш комментарий :)   -  person H. Pauwelyn    schedule 04.10.2017


Ответы (1)


Глядя на ваши результаты, все в порядке, поскольку вы ищете термин в Имени ИЛИ Фамилии ИЛИ < em>Заголовок, поэтому вы получаете результаты, содержащие элементы фразы в этих полях.

Поскольку Examine не полностью поддерживает фразовые запросы, я предлагаю создать поле с возможностью поиска, в котором будут храниться все эти поля вместе, и построить запрос к этому полю, где мы будем искать точные термины из фразы (а не всей фразы) . Это также может быть сложно, поскольку, возможно, вы не можете контролировать порядок полей, и результаты также могут быть непоследовательными. Стоит поиграть с ним.

Пример кода, демонстрирующий такое поведение, может быть таким:

if (searchTerm.Contains(" "))
{
    string[] terms = searchTerm.Split(' ');
    examineQuery.And().GroupedOr(new List<string> { SearchableFieldToSearch }, terms);
}

Вторым вариантом может быть разделение полей в самой форме поиска (раздельные вводы для имени, фамилии и должности - конечно, если это возможно) и построение запроса с операцией GroupedAnd.

criteria.GroupedAnd(new[] { "naam", "voornaam", "titel" }.ToList(), new[] { firstName, lastName, title });

Вы можете прочитать больше о Групповых операциях в документации здесь: https://github.com/Shazwazza/Examine/wiki/Grouped-Operations.

Если ничего из вышеперечисленного не работает, возможно, стоит создать запрос с пользовательским повышением и просто обрезать/удалить результаты с оценкой ниже ожидаемой.

Надеюсь, это поможет вам и укажет правильное направление. Поделитесь своими результатами :)

person Marcin Zajkowski    schedule 04.10.2017
comment
Я проверю этот ответ сегодня вечером. Потом поделюсь результатами. Спасибо, в любом случае :) - person H. Pauwelyn; 04.10.2017