这看起来是如此简单,以至于我确信我必须忽略某些东西。我无法确定如何在Lucene中执行以下操作:
问题

  • 我正在搜索地名。
  • 我有一个名为Name的字段
  • 它正在使用Lucene.Net.Analysis.Standard.StandardAnalyzer
  • TOKENIZED
  • Name的值在值halong bay中包含1个空格。
  • 由于文化差异的拼写或真正的拼写错误,搜索词可能包含也可能不包含多余的空格。例如。 ha long bay而不是halong bay
  • 如果我使用halong bay这个词,我会很受欢迎。
  • 如果我使用ha long bay这个词,我不会受到打击。

  • 尝试的解决方案
    这是我用来从Sitecore使用LINQ到Lucene构建谓词的代码:
    var searchContext = ContentSearchManager.GetIndex("my_index").CreateSearchContext();
    var term = "ha long bay";
    var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Name == term);
    var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate);
    
    我也尝试使用.Like()扩展名进行模糊匹配:
    var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Like(term));
    
    这也不会产生ha long bay的结果。
    如何在Sitecore中配置Lucene以返回halong bayha long bay搜索字词的匹配项,理想情况下,无需对输入字词做任何花哨的操作(例如,剥离空间,添加通配符等)?
    注意:我知道这也可以使h a l o n g b a y一词产生成功,但是我认为我对此没有问题。

    最佳答案

    TOKENIZED字段表示该字段值由 token (在这种情况下为空格)分割,并且将所得到的术语添加到索引字典中。如果在这样的字段中为“halong bay”建立索引,它将创建“halong”和“bay”这两个术语。

    搜索引擎无法通过“ha long”搜索查询检索到此结果是很正常的,因为它不知道带有“ha”或“long”项的任何结果。

    手动方法是定义所有其他方式,将地名写入另一个名为AlternateNames的多值计算索引字段中。然后,您可以发出这种查询:Name==query OR AlternateNames==query

    一种自动的方法是在一个单独的名为CompactName的计算索引字段中索引地名,但不带空格。然后,您可以发出这种查询:Name==query OR CompactName==compactedQueryWithoutSpaces
    我希望这有帮助

    杰夫

    关于c# - 具有空格的Sitecore Lucene索引搜索词匹配不带空格的相同单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39001887/

    10-09 02:47