我已经创建了一个搜索功能,为此我创建了一个新的索引器和搜索器。问题是当我输入一个带有空格的搜索查询时。示例如下。
我已经创建了这个人并站在我的索引中:
+---------------+------------+-------------+
| 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);
检查索引
<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"/>
我也试过这个并获得了最好的结果:
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
答案 0 :(得分:3)
查看结果一切都很好,因为您在名字 或 姓氏 中搜索字词 标题,因此您可以获得包含这些字段中词组元素的结果。
由于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。
如果上述方法都不起作用,或许可以使用自定义提升来构建查询,只需将结果修剪/删除得分低于预期。
希望它会帮助你并指出正确的方向。分享您的结果:)