给出一个看起来像这样的模型:
{
[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在这里很好用。看来问题在于字母和数字的混合。
答案 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;
}
}