elasticsearch Nest Elasticsearch-搜索某些字段的前面和其他字段的后面
我有一个例子,我需要在一些属性(姓和名)的第一部分进行部分匹配,在一些其他属性的末尾进行部分匹配,我想知道如何添加这两个分析器。 例如,如果我的名字是“elastic”,我现在可以搜索“elastic”并找到它。但是,如果我的账号是abc12345678,我需要搜索“5678”并找到所有以该账号结尾的账号,但我不能用名字搜索“stic”并找到“elastic” 下面是我的Person类的一个简化示例:elasticsearch Nest Elasticsearch-搜索某些字段的前面和其他字段的后面,elasticsearch,nest,elasticsearch,Nest,我有一个例子,我需要在一些属性(姓和名)的第一部分进行部分匹配,在一些其他属性的末尾进行部分匹配,我想知道如何添加这两个分析器。 例如,如果我的名字是“elastic”,我现在可以搜索“elastic”并找到它。但是,如果我的账号是abc12345678,我需要搜索“5678”并找到所有以该账号结尾的账号,但我不能用名字搜索“stic”并找到“elastic” 下面是我的Person类的一个简化示例: public class Person { public string
public class Person
{
public string AccountNumber { get; set; }
[ElasticProperty(IndexAnalyzer = "partial_name", SearchAnalyzer = "full_name")]
public string LastName { get; set; }
[ElasticProperty(IndexAnalyzer = "partial_name", SearchAnalyzer = "full_name")]
public string FirstName { get; set; }
}
以下是我创建索引的相关现有代码,它目前非常适合搜索单词的开头:
//Set up analyzers on some fields to allow partial, case-insensitive searches.
var partialName = new CustomAnalyzer
{
Filter = new List<string> { "lowercase", "name_ngrams", "standard", "asciifolding" },
Tokenizer = "standard"
};
var fullName = new CustomAnalyzer
{
Filter = new List<string> { "standard", "lowercase", "asciifolding" },
Tokenizer = "standard"
};
var result = client.CreateIndex("persons", c => c
.Analysis(descriptor => descriptor
.TokenFilters(bases => bases.Add("name_ngrams", new EdgeNGramTokenFilter
{
MaxGram = 15, //Allow partial match up to 15 characters.
MinGram = 2, //Allow no smaller than 2 characters match
Side = "front"
}))
.Analyzers(bases => bases
.Add("partial_name", partialName)
.Add("full_name", fullName))
)
.AddMapping<Person>((m => m.MapFromAttributes()))
);
您需要声明另一个分析器(我们称之为
partialBack
),专门用于从后面进行匹配,但您肯定可以重用现有的edengram
令牌筛选器,如下所示:
var partialBack = new CustomAnalyzer
{
Filter = new List<string> { "lowercase", "reverse", "name_ngrams", "reverse" },
Tokenizer = "keyword"
};
...
.Analyzers(bases => bases
.Add("partial_name", partialName)
.Add("partial_back", partialBack))
.Add("full_name", fullName))
)
var partialBack=新的CustomAnalyzer
{
过滤器=新列表{“小写”、“反向”、“名称”、“反向”},
标记器=“关键字”
};
...
.分析仪(基准=>基准
.添加(“部分名称”,部分名称)
.Add(“partial_back”,partialBack))
.Add(“全名”,全名))
)
这里的关键是双重使用令牌过滤器
字符串(abc12345678
)为
- 第一个小写(
)abc12345678
- 然后反转(
)87654321cba
- 然后边缘框架(
,87
,876
,8765
,87654
,…)876543
- 最后,令牌再次被反转(
,78
,678
,5678
,45678
,…)李>345678
如您所见,结果是字符串被标记为“从后面”,因此对
5678
的搜索将匹配abc12345678
,您需要声明另一个分析器(我们称之为partialBack
)专门用于从后面进行匹配,但您肯定可以重用现有的edgeNGram
标记过滤器,如下所示:
var partialBack = new CustomAnalyzer
{
Filter = new List<string> { "lowercase", "reverse", "name_ngrams", "reverse" },
Tokenizer = "keyword"
};
...
.Analyzers(bases => bases
.Add("partial_name", partialName)
.Add("partial_back", partialBack))
.Add("full_name", fullName))
)
var partialBack=新的CustomAnalyzer
{
过滤器=新列表{“小写”、“反向”、“名称”、“反向”},
标记器=“关键字”
};
...
.分析仪(基准=>基准
.添加(“部分名称”,部分名称)
.Add(“partial_back”,partialBack))
.Add(“全名”,全名))
)
这里的关键是双重使用令牌过滤器
字符串(abc12345678
)为
- 第一个小写(
)abc12345678
- 然后反转(
)87654321cba
- 然后边缘框架(
,87
,876
,8765
,87654
,…)876543
- 最后,令牌再次被反转(
,78
,678
,5678
,45678
,…)李>345678
如您所见,结果是字符串被标记为“从后面”,因此对
5678
的搜索将匹配abc12345678
,您需要声明另一个分析器(我们称之为partialBack
)专门用于从后面进行匹配,但您肯定可以重用现有的edgeNGram
标记过滤器,如下所示:
var partialBack = new CustomAnalyzer
{
Filter = new List<string> { "lowercase", "reverse", "name_ngrams", "reverse" },
Tokenizer = "keyword"
};
...
.Analyzers(bases => bases
.Add("partial_name", partialName)
.Add("partial_back", partialBack))
.Add("full_name", fullName))
)
var partialBack=新的CustomAnalyzer
{
过滤器=新列表{“小写”、“反向”、“名称”、“反向”},
标记器=“关键字”
};
...
.分析仪(基准=>基准
.添加(“部分名称”,部分名称)
.Add(“partial_back”,partialBack))
.Add(“全名”,全名))
)
这里的关键是双重使用令牌过滤器
字符串(abc12345678
)为
- 第一个小写(
)abc12345678
- 然后反转(
)87654321cba
- 然后边缘框架(
,87
,876
,8765
,87654
,…)876543
- 最后,令牌再次被反转(
,78
,678
,5678
,45678
,…)李>345678
如您所见,结果是字符串被标记为“从后面”,因此对
5678
的搜索将匹配abc12345678
,您需要声明另一个分析器(我们称之为partialBack
)专门用于从后面进行匹配,但您肯定可以重用现有的edgeNGram
标记过滤器,如下所示:
var partialBack = new CustomAnalyzer
{
Filter = new List<string> { "lowercase", "reverse", "name_ngrams", "reverse" },
Tokenizer = "keyword"
};
...
.Analyzers(bases => bases
.Add("partial_name", partialName)
.Add("partial_back", partialBack))
.Add("full_name", fullName))
)
var partialBack=新的CustomAnalyzer
{
过滤器=新列表{“小写”、“反向”、“名称”、“反向”},
标记器=“关键字”
};
...
.分析仪(基准=>基准
.添加(“部分名称”,部分名称)
.Add(“partial_back”,partialBack))
.Add(“全名”,全名))
)
这里的关键是双重使用令牌过滤器
字符串(abc12345678
)为
- 第一个小写(
)abc12345678
- 然后反转(
)87654321cba
- 然后边缘框架(
,87
,876
,8765
,87654
,…)876543
- 最后,令牌再次被反转(
,78
,678
,5678
,45678
,…)李>345678
如您所见,结果是字符串被标记为“从后面”,因此对
5678
的搜索将匹配abc12345678
谢谢@Val。我将在星期一尝试这一点。这很好。工作得很好。谢谢你的帮助。谢谢@Val。星期一第一件事我就试试。真漂亮。工作表现