繁体   English   中英

如何在 Azure 中为自定义分析器允许通配符

[英]How to allow wildcards for custom analyzer in Azure Search

提前感谢您的帮助。

我正在使用 Azure Search.Net SDK 来构建索引器。 我目前也在使用自定义分析器

在使用自定义分析器之前,我使用的是 EnLucene 分析器,它允许我使用通配符搜索 *. 比如我是用来让用户搜索后缀搜索的。 如果用户搜索“app”,它会返回“apple, application, approach”等结果。 请不要建议自动完成或建议,因为建议器不能与自定义分析器一起使用。 我不想仅仅因为建议者而创建额外的 20 个搜索字段。 (一个用于建议者,一个用于搜索)。

下面是我的自定义分析器示例。 它不允许我使用 * 进行部分匹配。 我不是在寻找任何前缀或后缀部分匹配的 NGram 解决方案。 我实际上想使用通配符 *. 我该怎么做才能允许通配符搜索?

var definition = new Index()
{
    Name = indexName,
    Fields = mapFields,
    Analyzers = new[]
    {
        new CustomAnalyzer
        {
            Name = "custom_analyzer",
            Tokenizer = TokenizerName.Whitespace,
            TokenFilters = new[]
            {
                TokenFilterName.AsciiFolding,
                TokenFilterName.Lowercase,
                TokenFilterName.Phonetic
            }
        }
    }
};

您可以这样做:

  • 添加您的自定义分析器,如下所示:

 { "name":"names", "fields":[ { "name":"id", "type":"Edm.String", "key":true, "searchable":false }, { "name":"name", "type":"Edm.String", "analyzer":"my_standard" } ], "analyzers":[ { "name":"my_standard", "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer", "tokenizer":"standard", "tokenFilters":[ "lowercase", "asciifolding" ] } ] } // Below snippet is for creating definition using c# new CustomAnalyzer { Name = "custom_analyzer", Tokenizer = TokenizerName.Standard, TokenFilters = new[] { TokenFilterName.Lowercase, TokenFilterName.AsciiFolding, TokenFilterName.Phonetic } }

  • 然后在创建文档定义时引用自定义分析器,如下所示:

 [IsSearchable, IsFilterable, IsSortable, Analyzer("custom_analyzer")] public string Property { get; set; }

查看此博客以获取更多参考:

https://azure.microsoft.com/en-in/blog/custom-analyzers-in-azure-search/

以下是定制分析仪的示例测试方法:

[Fact]
        public void CanSearchWithCustomAnalyzer()
        {
            Run(() =>
            {
                const string CustomAnalyzerName = "my_email_analyzer";
                const string CustomCharFilterName = "my_email_filter";

                Index index = new Index()
                {
                    Name = SearchTestUtilities.GenerateName(),
                    Fields = new[]
                    {
                        new Field("id", DataType.String) { IsKey = true },
                        new Field("message", (AnalyzerName)CustomAnalyzerName) { IsSearchable = true }
                    },
                    Analyzers = new[]
                    {
                        new CustomAnalyzer()
                        {
                            Name = CustomAnalyzerName,
                            Tokenizer = TokenizerName.Standard,
                            CharFilters = new[] { (CharFilterName)CustomCharFilterName }
                        }
                    },
                    CharFilters = new[] { new PatternReplaceCharFilter(CustomCharFilterName, "@", "_") }
                };

                Data.GetSearchServiceClient().Indexes.Create(index);

                SearchIndexClient indexClient = Data.GetSearchIndexClient(index.Name);

                var documents = new[]
                {
                    new Document() { { "id", "1" }, { "message", "My email is someone@somewhere.something." } },
                    new Document() { { "id", "2" }, { "message", "His email is someone@nowhere.nothing." } },
                };

                indexClient.Documents.Index(IndexBatch.Upload(documents));
                SearchTestUtilities.WaitForIndexing();

                DocumentSearchResult<Document> result = indexClient.Documents.Search("someone@somewhere.something");

                Assert.Equal("1", result.Results.Single().Document["id"]);
            });
        }

随时在您的对话中标记我,希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM