簡體   English   中英

.NET 彈性搜索創建 NGram 索引

[英].NET Elastic Search Create NGram Index

我正在嘗試將彈性搜索設置為可能使用它的項目的原型。 該項目需要查看數據集的內容並使其可搜索。

我現在擁有的是以下內容:

  • 索引文件
  • 在索引文檔的所有字段中搜索全文

現在缺少的是:

  • 在索引文檔的所有字段中搜索部分文本

這意味着我可以通過搜索“Sofia”、“sofia”、“anderson”或“canada”從我的數據庫中找到這個示例數據集,但不能通過搜索“canad”。

{“id”:46,“firstName”:“Sofia”,“lastName”:“Anderson”,“country”:“Canada”}

我正在使用“Elastic.Clients.Elasticsearch”NuGet package 創建我的索引。 我嘗試使用 NGram-Tokenizer 創建索引並將其應用於所有字段。 這似乎在某種程度上不起作用。

這是我用來創建索引的代碼:

Client.Indices.Create(IndexName, c => c
    .Settings(s => s
        .Analysis(a => a
            .Tokenizer(t => t.Add(TokenizerName, new Tokenizer(new TokenizerDefinitions(new Dictionary<string, ITokenizerDefinition>() { { TokenizerName, ngram } }))))
            .Analyzer(ad => ad
                .Custom(AnalyzerName, ca => ca
                    .Tokenizer(TokenizerName)
                )
            )
        )
    )
    .Mappings(m => m
        .AllField(all => all
            .Enabled()
            .Analyzer(AnalyzerName)
            .SearchAnalyzer(AnalyzerName)
        )
    )
);

private string TokenizerName => "my_tokenizer";
private string AnalyzerName => "my_analyzer";

var ngram = new NGramTokenizer() { MinGram = 3, MaxGram = 3, TokenChars = new List<TokenChar>() { TokenChar.Letter }, CustomTokenChars = "" };

使用此代碼,我得到了上述行為。

我的代碼有錯誤嗎? 我錯過了什么嗎? 您需要更多信息嗎?

提前致謝

保羅

我沒有找到在 .NET 中運行它的方法。

但是,對我有用的是使用此 API 調用創建索引:

URL:

https://{{elasticUrl}}/{{indexName}}

身體:

{
    "mappings": {
        "properties": {
            "firstName": {
                "type":"text",
                "analyzer":"index_ngram",
                "search_analyzer":"search_ngram"
            },
            "lastName": {
                "type":"text",
                "analyzer":"index_ngram",
                "search_analyzer":"search_ngram"
            },
            "country": {
                "type":"text",
                "analyzer":"index_ngram",
                "search_analyzer":"search_ngram"
            }
        }
    },
    "settings": {
        "index": {
            "max_ngram_diff":50
        },
        "analysis": {
            "filter": {
                "ngram_filter": {
                    "type": "ngram",
                    "min_gram": 2,
                    "max_gram": 25
                }
            },
            "analyzer": {
                "index_ngram": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": [ "ngram_filter", "lowercase" ]
                },
                "search_ngram": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": "lowercase"
                }
            }
        }
    }
}

這導致 NGram 的字段長度為 2 到 25:firstName、lastName、country。

我希望這對將來的某人有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM