elasticsearch Nest Elasticsearch-搜索某些字段的前面和其他字段的后面,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch Nest Elasticsearch-搜索某些字段的前面和其他字段的后面,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch Nest Elasticsearch-搜索某些字段的前面和其他字段的后面

elasticsearch Nest Elasticsearch-搜索某些字段的前面和其他字段的后面,elasticsearch,nest,elasticsearch,Nest,我有一个例子,我需要在一些属性(姓和名)的第一部分进行部分匹配,在一些其他属性的末尾进行部分匹配,我想知道如何添加这两个分析器。 例如,如果我的名字是“elastic”,我现在可以搜索“elastic”并找到它。但是,如果我的账号是abc12345678,我需要搜索“5678”并找到所有以该账号结尾的账号,但我不能用名字搜索“stic”并找到“elastic” 下面是我的Person类的一个简化示例: public class Person { public string

我有一个例子,我需要在一些属性(姓和名)的第一部分进行部分匹配,在一些其他属性的末尾进行部分匹配,我想知道如何添加这两个分析器。 例如,如果我的名字是“elastic”,我现在可以搜索“elastic”并找到它。但是,如果我的账号是abc12345678,我需要搜索“5678”并找到所有以该账号结尾的账号,但我不能用名字搜索“stic”并找到“elastic”

下面是我的Person类的一个简化示例:

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。星期一第一件事我就试试。真漂亮。工作表现