使用空格时Lucene搜索不起作用

4zcjmb1e  于 2023-01-02  发布在  Lucene
关注(0)|答案(1)|浏览(233)

∮我的处境∮
我创建了一个搜索功能,为此我创建了一个新的索引器和搜索器。问题是当我输入一个带有空格的搜索查询时。示例如下。

数据

我已经创建了这个人,并将其放在我的索引中:
| 人数|名|姓|
| - ------| - ------| - ------|
| 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();

当我执行上面searchCriteriaToString()查询并在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|三个|

  • 人员的编号。如果为空:未找到或未接受
n6lpvg4x

n6lpvg4x1#

看看你的结果都是好的,因为你搜索的术语在 * 名字*姓氏标题 *,所以你得到的结果包含在这些字段的短语元素。
由于检查不完全支持短语查询,我的建议是创建一个可搜索的字段,将存储所有这些字段的组合,并建立一个对这个字段的查询,我们将从短语(而不是整个短语本身)寻找确切的术语。这可能会变得棘手,也因为也许你不能控制字段的顺序和结果可能会变得不一致太。值得一试。
演示此行为的示例代码可能如下所示:

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.
如果以上方法都不起作用,也许值得使用自定义提升来构建一个查询,并修剪/去除得分低于预期的结果。
希望对你有帮助,并指出正确的方向。分享你的结果:)

相关问题