Моя ситуация
Я создал функцию поиска и для этого создал новый индексатор и поисковик. Проблема в том, что я ввожу поисковый запрос с пробелом. Пример ниже.
Данные
У меня есть эти люди, созданные и находящиеся внутри моего индекса:
+---------------+------------+-------------+
| 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