ElasticSearch含斜杠的DOI字段需用何种分词器实现精确匹配?
问题:DOI字段实现精确匹配的Elasticsearch配置方案
问题背景
我正在构建一个支持多字段筛选的搜索功能,其中DOI字段需要返回精确匹配的结果。
数据模型
使用的实体类代码如下:
public class PaperElasticSearchModel { public string Title { get; set; } public string Abstract { get; set; } public string Keywords { get; set; } public string DOI { get; set; } public int Year { get; set; } public string[] Author { get; set; } }
DOI格式示例:10.1523/JNEUROSCI.18-04-01622.1998
当前索引配置
现有Elasticsearch索引创建代码:
Client.Indices.Create(index, pub => pub .Settings(s => s .Analysis(descriptor => descriptor .Analyzers(analyzer => analyzer .Custom("custom_analyzer", ca => ca .Filters("lowercase", "stop", "classic", "word_delimiter") ) ) .TokenFilters(bases => bases .EdgeNGram("custom_analyzer", td => td .MinGram(2) .MaxGram(25)) ) ) .Setting(UpdatableIndexSettings.MaxNGramDiff, 23) ) .Map<PubScreenSearch>(m => m .AutoMap() .Properties(p => p .Text(t => t .Name(f => f.Author) .Analyzer("custom_analyzer")) .Text(t => t .Name(f => f.Keywords) .Analyzer("custom_analyzer")) .Text(t => t .Name(f => f.Title) .Analyzer("custom_analyzer")) .Keyword(t => t .Name(f => f.DOI) ) )));
失败的尝试
曾尝试用Pattern分词器配置DOI字段,但未实现精确匹配:
.Text(t => t .Name(f => f.DOI) .Analyzer(new PatternAnalyzer().Pattern = @"(.(\/|\?)*)\w+")
可行解决方案
无需修改分词器配置,在查询时指定DOI字段的keyword子字段执行Term查询,即可实现精确匹配:
filterQuery.Add(fq => fq .Bool(f => f .Must(boolSHould => boolSHould .Term(t => t .Field(feild => feild.DOI.Suffix("keyword")) .Value(value)) )) );
内容的提问来源于stack exchange,提问作者Suji
相关产品推荐
相关产品推荐

