Azure 搜索对破折号的行为不符合预期

问题描述

我在对以下示例数据集使用 azure 搜索时遇到问题:abc-123-456、abc-123-457、abc-123-458 等 在搜索 abc-123-456 时,我希望只返回一个结果,而是获取包含 abc-123-... 是否有一些设置或方法可以改变这种行为?

当前搜索设置:

TheSearchIndex.TokenFilters.Add(new EdgeNGramTokenFilter("frontEdgeNGram")
{
    Side = EdgeNGramTokenFilterSide.Front,MinGram = 3,MaxGram = 20
});

TheSearchIndex.Analyzers.Add(new CustomAnalyzer("FrontEdgeNGram",LexicalTokenizerName.Whitespace)
{
    TokenFilters =
    {
        TokenFilterName.Lowercase,new TokenFilterName("frontEdgeNGram"),TokenFilterName.Classic,TokenFilterName.AsciiFolding
    }
});

SearchOptions UseRSSearchOptions = new SearchOptions
{
    QueryType = SearchQueryType.Simple,SearchMode = SearchMode.All,};

使用 azure.search.documents 11.1.1 版

编辑:用 abc-123-456* 和星号搜索给了我预期的结果。如何让这种行为认工作?

只是为了补充一下..

门户版本为2020-06-30 我们使用的sdk版本是azure.search.documents ver 11.1.1

  1. abc-123-456 未按预期工作
  2. “abc-123-456”没有按预期工作
  3. “abc-123-456”* 不起作用
  4. “abc-123-456*”不起作用

如果我们在搜索文本的末尾附加一个星号并且它不在一个短语内..它会按预期工作。 IE: abc-123-456* 按预期工作。 (abc-123-456* | abc-123-457* ) 按预期工作。

为什么需要星号?我们如何才能在一个短语中完成这项工作?

解决方法

这是在自定义分析器配置中使用 EdgeNGramTokenFilter 时的预期行为。文本“abc-123-456”被分解为更小的标记,如“abc”、“abc-1”、“abc-12”、“abc-123”....“abc-123-456”。查看 Analyzer API 以获取特定分析器生成的完整令牌列表。

对于查询 - abc-123,如果使用默认分析器,则查询词将是 abc123,并将匹配包含这些词的所有文档。

另一方面,不会分析前缀查询,而是查找包含“abc-123”前缀的文档。 prefix search 绕过全文搜索并查找逐字匹配,这就是返回正确结果的原因。全文搜索超过倒排索引中的标记。其他所有内容(过滤器、模糊、正则表达式、前缀/通配符等)都位于单独的未处理/内部索引中的逐字字符串。

另一种方法是仅将字段上的搜索分析器设置为关键字,以避免破坏输入查询。