∮我的处境∮
我创建了一个搜索功能,为此我创建了一个新的索引器和搜索器。问题是当我输入一个带有空格的搜索查询时。示例如下。
数据
我已经创建了这个人,并将其放在我的索引中:
| 人数|名|姓|
| - ------| - ------| - ------|
| 1个|伊尔塞|范德布尔格|
| 第二章|德沃尔德|马林|
搜索结果
我尝试了以下查询:
| 查询编号|期限|实际结果 *|接受结果 *|
| - ------| - ------| - ------| - ------|
| 1个|货车|1个|1个|
| 第二章|范德|1个|1个|
| 三个|伊尔塞|1个|1个|
| 四个|范德堡||1个|
| 五个|范德堡伊尔斯||1个|
| 六个|德|1和2| 1和2|
| 七|吞食者|第二章|第二章|
| 八个|德沃尔德马林||第二章|
| 九|马林德沃尔德||第二章|
- 人员的编号。如果为空:未找到或未接受
问题
有些疑问不是我接受的,怎么解决?
∮我的密码∮
下面是我编写的代码:
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();
当我执行上面searchCriteria
的ToString()
查询并在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)) }
这里的问题是,当我得到两个人有相同的姓氏。例如:
| 人数|名|姓|
| - ------| - ------| - ------|
| 三个|马克|德瓦德|
| 四个|弗雷迪|德瓦德|
- 搜索结果:**
结果1至9均为良好。
| 查询编号|期限|实际结果 *|接受结果 *|
| - ------| - ------| - ------| - ------|
| 十个|德瓦代|3和4| 3和4|
| 十一|德瓦德弗雷迪|3和4|四个|
| 十一|德瓦德马克|3和4|三个|
- 人员的编号。如果为空:未找到或未接受
1条答案
按热度按时间n6lpvg4x1#
看看你的结果都是好的,因为你搜索的术语在 * 名字*或姓氏或标题 *,所以你得到的结果包含在这些字段的短语元素。
由于检查不完全支持短语查询,我的建议是创建一个可搜索的字段,将存储所有这些字段的组合,并建立一个对这个字段的查询,我们将从短语(而不是整个短语本身)寻找确切的术语。这可能会变得棘手,也因为也许你不能控制字段的顺序和结果可能会变得不一致太。值得一试。
演示此行为的示例代码可能如下所示:
第二种选择可能是在搜索表单本身中分离字段(分离名字、姓氏和头衔的输入--当然如果可能的话),并使用GroupedAnd操作构建查询。
有关分组操作的详细信息,请参阅以下文档:https://github.com/Shazwazza/Examine/wiki/Grouped-Operations.
如果以上方法都不起作用,也许值得使用自定义提升来构建一个查询,并修剪/去除得分低于预期的结果。
希望对你有帮助,并指出正确的方向。分享你的结果:)