如何使用字母数字字符和破折号索引字段以进行通配符搜索

时间:2019-03-25 21:40:03

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

给出一个看起来像这样的模型:

{
    [Key]
    public string Id { get; set; }

    [IsSearchable]
    [Analyzer(AnalyzerName.AsString.Keyword)]
    public string AccountId { get; set; }
}

AccountId的示例数据如下:

1-ABC123
1-333444555
1-A4KK498

该字段可以包含字母/数字和中间的破折号的任意组合。

我需要能够使用1-ABC *之类的查询在此字段上进行搜索。但是,除了关键字(Keyword)之外,没有一个基本的分析器都支持破折号。我看过其他一些有关自定义分析器的文章,但是我无法获得有关如何构建它来解决此问题的足够信息。

我需要知道是否必须为此领域构建客户分析器,我是否需要其他搜索分析器和索引分析器?

我正在将StandardLucene用于其他不带破折号的字母数字字段,而我还有另一个带破折号的字段,但是全都是数字,并且Keyword在这里很好用。看来问题在于字母和数字的混合。

1 个答案:

答案 0 :(得分:1)

自定义分析器确实是您的理想之选。 基本上,您可以定义一个自定义分析器,该分析器使用带有“小写”令牌过滤器的“关键字”令牌生成器。

将自定义分析器添加到Index类,并在模型中更改分析器名称以匹配自定义分析器名称:

T

型号:

UtilityThing<T>

在REST API中,它类似于:

public interface IThing {
    string MyProperty { get; set; } 
}

public abstract class Thing<T> {
    protected string _MyProperty;
    public abstract string MyProperty { get; set; }
    public T OtherProperty { get; set; }

    public string CommonMethod() {
        return MyProperty + "foobar";   
    }
}

public class IntThing : Thing<int?>, IThing {
    public override string MyProperty {
        get { return _MyProperty; }
        set { _MyProperty = value + OtherProperty.ToString(); }
    }
}

public class StringThing: Thing<string>, IThing {
    public override string MyProperty {
        get { return _MyProperty; }
        set { _MyProperty = OtherProperty + value; }
    }
}

public class UtilityThing<T> where T: IThing, new() {
    public T DoIt(SomeContext someContext, string name) {
        string contextVal = someContext.GetValue(name);

        var thing = new T { MyProperty = contextVal }
        return thing;
    }
}