gpt4 book ai didi

asp.net - ASP.NET中的 Elasticsearch -使用&符号

转载 作者:行者123 更新时间:2023-12-03 00:50:06 25 4
gpt4 key购买 nike

我是ASP.NET中的Elastic Search的新手,目前有一个问题无法解决。

从文档中,我已经看到&符号未作为特殊字符列出。但是,当我提交搜索与符号时,它会被完全忽略。例如,如果我搜索procter & gamble&符号将被完全忽略。这给我带来了很多问题,因为我有一些公司的名称类似于M&S。当&符号被忽略时,我基本上得到了所有带有M或S的东西。如果我尝试使用精确搜索(M&S),则会遇到相同的问题。

我的代码是:

void Connect()
{
node = new Uri(ConfigurationManager.AppSettings["Url"]);
settings = new ConnectionSettings(node);
settings.DefaultIndex(ConfigurationManager.AppSettings["defaultIndex"]);
settings.ThrowExceptions(true);
client = new ElasticClient(settings);
}

private string escapeChars(string inStr) {
var temp = inStr;
temp = temp
.Replace(@"\", @"\\")
.Replace(@">",string.Empty)
.Replace(@"<",string.Empty)
.Replace(@"{",string.Empty)
.Replace(@"}",string.Empty)
.Replace(@"[",string.Empty)
.Replace(@"]",string.Empty)
.Replace(@"*",string.Empty)
.Replace(@"?",string.Empty)
.Replace(@":",string.Empty)
.Replace(@"/",string.Empty);
return temp;
}

然后在我的功能之一内
Connect();    
ISearchResponse<ElasticSearch_Result> search_result;
var QString = escapeChars(searchString);
search_result = client.Search<ElasticSearch_Result>(s => s
.From(0)
.Size(101)
.Query(q =>
q.QueryString(b =>
b.Query(QString)
//.Analyzer("whitespace")
.Fields(fs => fs.Field(f => f.CompanyName))
)
)
.Highlight(h => h
.Order("score")
.TagsSchema("styled")
.Fields(fs => fs
.Field(f => f.CompanyName)
)
)
);

我试过包括分析器,但是后来我发现它们会改变 token 化器 split字的方式。我无法对 token 生成器进行更改。

我希望能够有以下情形:

搜索: M&S Company Foo Bar
token : M&S Company Foo Bar +如果有可能也有 M S token ,则奖励

我正在使用 flex 搜索V5.0。

任何帮助都超过了欢迎。包括比在这里找到的更好的文档: https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/writing-queries.html

最佳答案

默认情况下,分析器应用的文本字段为standard analyzer。该分析器将standard tokenizerlowercase token filter一起应用。因此,当您根据该字段为某个值建立索引时,标准分析器将应用于该值,并且由此产生的 token 也将针对该字段进行索引。

让我们通过例如对于字段companyName(文本类型),让我们假设在索引文档时传递的值是M&S Company Foo Bar。应用标准分析器后,此值的结果标记为:

m
s
company
foo
bar

您会注意到,不仅空格而且 &都用作分隔符,以拆分和生成 token 。

当您针对该字段进行查询且未在搜索查询中传递任何分析器时,默认情况下,它也会将同一分析器也应用于搜索,该分析器也将用于对该字段建立索引。因此,如果您搜索 M&S,它将被标记为 MS,因此实际搜索查询将搜索这两个标记而不是 M&S

要解决此问题,您需要更改字段 companyName的分析器。您可以创建一个使用 whitespace tokenizer和小写过滤器的自定义分析器,而不是标准分析器(以使搜索大小写不敏感)。为此,您需要如下更改设置和映射:
{
"settings": {
"analysis": {
"analyzer": {
"whitespace_lowercase": {
"tokenizer": "whitespace",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"companyName": {
"type": "text",
"analyzer": "whitespace_lowercase",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}

现在对于上述输入,生成的 token 将是:
m&s
company
foo
bar

这将确保在搜索 M&S时不忽略 &

关于asp.net - ASP.NET中的 Elasticsearch -使用&符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55180647/

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