我正在ElasticSearch
项目中使用VB.NET
。正常的搜索效果很好,即任何单词都可以。但是,现在根据要求,我还想按特殊字符(即?
)进行搜索。我使用?
作为常规搜索,但无法正常工作。代码:
client.CreateIndex(Function(d) d.Analysis(Function(z) z.Analyzers(Function(a) a.Add("nGram_analyzer", Get_nGram_analyzer()).
Add("whitespace_analyzer", Get_whitespace_analyzer()).
Add("autocmp", New Nest.CustomAnalyzer() With {.Tokenizer = "edgeNGram", .Filter = {"lowercase"}})).
Tokenizers(Function(t) t.Add("edgeNGram", New Nest.EdgeNGramTokenizer With {.MinGram = 1, .MaxGram = 20})).
TokenFilters(Function(t) t.Add("nGram_filter", Get_nGram_filter()))).
Index(Of view_Article).AddMapping(Of view_Article)(ArticleMapping)
Private Shared Function Get_nGram_filter() As NgramFilter
Return New NgramFilter With {
.MinGram = 1,
.MaxGram = 20,
.token_chars = New List(Of String) From {"letter", "digit", "punctuation", "symbol"}
}
End Function
Private Shared Function Get_nGram_analyzer() As CustomAnalyzer
Return New CustomAnalyzer() With {
.Tokenizer = "whitespace",
.Filter = New List(Of String)() From {"lowercase", "asciifolding", "nGram_filter"}
}
End Function
Private Shared Function Get_whitespace_analyzer() As CustomAnalyzer
Return New CustomAnalyzer() With {
.Tokenizer = "whitespace",
.Filter = New List(Of String)() From {"lowercase", "asciifolding"}
}
End Function
搜索查询:
"query": {
"query_string": {
"query": "?",
"fields": [
"title"",
"abstract"
],
"default_operator": "and",
"analyze_wildcard": true
}
}
我需要做哪些修改才能使其正常工作?
我不熟悉vb.net
语法,因此使用了基于JSON的Elasticsearch rest API来显示如何解决它,并且由于您没有以JSON格式提供映射,因此我创建了一个最小的示例来显示解决方案。
最重要的是,您需要检查分析器是否正在索引特殊字符,如果正在索引,则需要在查询时对其进行转义。
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace" --> this will preserve special char
}
}
}
{
"title" : "amit?"
}
{
"query": {
"query_string": {
"query": "amit\\?", --> note this
"default_field": "title"
}
}
}
"hits": [
{
"_index": "special-char",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"title": "amit?" -->
}
}
]