【问题标题】:Azure search not behaving as expected for dashesAzure 搜索对破折号的行为不符合预期
【发布时间】:2021-04-26 01:31:53
【问题描述】:

在对以下示例数据集使用 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* ) 按预期工作。

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

【问题讨论】:

    标签: azure-cognitive-search azure-search-.net-sdk


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多