gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:42:29 24 4
gpt4 key购买 nike

在某些情况下,我需要在某些属性(姓氏和名字)的第一部分进行部分匹配,而在其他某些属性的末尾进行部分匹配,我想知道如何添加两个分析器。
例如,如果我的名字是“elastic”,那么我现在可以搜索“elas”并找到它。但是,如果我的帐号为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()))
);

似乎我可以添加另一个EdgeNGramTokenFilter,并使Side =“back”,但是我不希望名字和姓氏搜索与背面搜索匹配。有人可以提供一种方法吗?
谢谢,
阿德里安

编辑

为了完整起见,这是属性上的新装饰器,与接受的答案中的代码一起提供:
[ElasticProperty(IndexAnalyzer = "partial_back", SearchAnalyzer = "full_name")]
public string AccountNumber { get; set; }

最佳答案

您需要声明另一个专门用于从后面进行匹配的分析器(我们称其为partialBack),但是您可以肯定地重用现有的edgeNGram token 过滤器,如下所示:

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))
)

这里的关键是 reverse token 过滤器的双重使用。

字符串( abc12345678)是
  • 首先小写(abc12345678),
  • 然后反转(87654321cba),
  • 然后进行边缘标记(87876876587654876543,...)
  • ,最后再次反转 token (78678567845678345678,...)。

  • 如您所见,结果是字符串从“后面”被标记化了,因此对 5678的搜索将与 abc12345678匹配。

    关于elasticsearch - Nest Elasticsearch-在某些字段的前面搜索,在其他字段的后面搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31754953/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com