使用ElasticSearch通过特殊字符搜索

问题描述 投票:0回答:1

我正在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 elasticsearch query-string
1个回答
0
投票

我不熟悉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?" -->
                }
            }
        ]
© www.soinside.com 2019 - 2024. All rights reserved.