我是ASP.NET中的弹性搜索的新手,我有一个问题,到目前为止,我还无法解决。
从文档中,我已经看到&符号并没有被列为特殊字符。然而,当我提交我的搜索时,我的&符号被完全忽略了。例如,如果我搜索procter & gamble,& sign将被完全忽略。这给我带来了很多问题,因为我的公司都有像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)
)
)
);我尝试过包含分析器,但后来我发现它们改变了标记器split单词的方式。我还无法实现对记号赋予器的更改。
我希望能够有以下场景:
搜索:M&S Company Foo Bar
令牌:M&S Company Foo Bar +奖励是如果也有M S令牌的话
我使用的是elastic search V5.0。
任何帮助都非常受欢迎。包括比这里找到的更好的文档:https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/writing-queries.html。
发布于 2019-03-15 22:07:14
默认情况下,对于文本字段,应用的分析器是standard analyzer。此分析器将standard tokenizer与lowercase token filter一起应用。因此,当您根据该字段对某些值进行索引时,将对该值应用标准分析器,并根据该字段对生成的标记进行索引。
让我们通过字段companyName (文本类型)来理解这一点,让我们假设在索引文档时传递的值是M&S Company Foo Bar。应用标准分析器后,该值的结果标记将为:
m
s
company
foo
bar您可以注意到,不仅使用空格,还使用&作为分隔符,以拆分和生成标记。
当您对该字段进行查询并且没有在搜索查询中传递任何分析器时,默认情况下,它也会应用相同的分析器进行搜索,该分析器也应用于对该字段进行索引。因此,如果搜索M&S,它将被标记为M和S,因此实际的搜索查询将搜索这两个标记,而不是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"
}
}
}
}
}
}
}现在,对于上面的输入,生成的标记将是:
m&s
company
foo
bar这将确保在搜索M&S时不会忽略&。
https://stackoverflow.com/questions/55180647
复制相似问题