【问题标题】:Azure Search SDK Regex?Azure 搜索 SDK 正则表达式?
【发布时间】:2016-05-20 21:23:47
【问题描述】:

我从这里看到 Azure 搜索支持 Lucene Regex:https://msdn.microsoft.com/en-us/library/azure/mt589323.aspx#bkmk_regex,但它没有描述如何使用 SDK 执行此操作。在我放弃所有希望之前,我想知道是否有人尝试过并成功了?

我和我的团队已经研究了好几天,试图弄清楚模糊搜索的工作原理,老实说,与市场上的其他工具相比,这个工具看起来非常有限。只是想看看有没有人做过。

API 版本:2015-02-28

这是我目前发现的:

@此链接:https://github.com/Azure/azure-content/blob/master/articles/search/search-query-lucene-examples.md

示例 8 -- 右键单击​​查询。搜索具有“高级”或“初级”一词的工作。

&queryType=full&$select=business_title&search=business_title:/(Sen|Jun)ior/

在 Portal.Azure.com(我的搜索资源管理器所在的位置...)上,我在 $select=CaseNumber&search=/508(0|1)/ 中键入以下项目,我试图在其中查找所有带有 508 且以 0 或 1 结尾的案例编号。这里是我的结果:

/$metadata#docs(CaseNumber)",
    "value": [
        {
            "@search.score": 0.13246636,
            "CaseNumber": "16-A-1238"
        },
        {
            "@search.score": 0.025094833,
            "CaseNumber": "SUV2014000179"
        }
    ]
}

现在如果我这样做:$select=CaseNumber&search=/5080(0|1)/

/$metadata#docs(CaseNumber)",
    "value": [
        {
            "@search.score": 0.33221063,
            "CaseNumber": "SUP238-5080"
        },
        {
            "@search.score": 0.13288425,
            "CaseNumber": "16-A-1238"
        },
        {
            "@search.score": 0.025173998,
            "CaseNumber": "SUV2014000179"
        }
    ]
}

如您所见,我终于得到了一个与我试图匹配的数字的案例......我要说的是算法中的某些东西不起作用,或者不像描述的那样起作用。

现在假设这真的是正则表达式,我应该能够做到这一点 /508.+/ 并得到任何以 508 开头的东西,但由于简单的例子似乎没有带回适当的结果,我要去没有。

【问题讨论】:

    标签: c# azure azure-cognitive-search


    【解决方案1】:

    好的,我们已经设法纠正了我们所看到的问题,为此,我们必须从索引器代码中删除 SDK。参考这个网址:https://azure.microsoft.com/en-us/blog/custom-analyzers-in-azure-search/

    analyzers = new[]{
         new Analyzer(){
             name = "my_default",
             type = "#Microsoft.Azure.Search.CustomAnalyzer",
             tokenizer = "standard",
             tokenFilters = new List<string>(){
                    "lowercase",
                    "asciifolding",
                    "phonetic",
                    "trim",
                    "my_edgeNGram" }
         },
    },
    tokenFilters = new[]{
         new EdgeNGramTokenFilter(){
              name = "my_edgeNGram",
              type = "#Microsoft.Azure.Search.EdgeNGramTokenFilter",
              minGram = 2,
              maxGram = 50}
         }
    

    这现在允许更准确的“模糊”搜索,而无需使用 RegEx 来获得我想要的。请参阅以下内容:

    $select=CaseNumber&search=508&searchFields=CaseNumber
    

    这返回了以下内容:

    {
        "@odata.context": "{MyURL}",
        "value": [
            {
                "@search.score": 5.188466,
                "CaseNumber": "SUP238-5080"
            },
            {
                "@search.score": 1.6886727,
                "CaseNumber": "SUP:501-6432"
            },
            {
                "@search.score": 1.6886727,
                "CaseNumber": "SUP:505-532"
            },
            {
                "@search.score": 1.6886727,
                "CaseNumber": "SUP:509-1851"
            },
            {
                "@search.score": 1.6886727,
                "CaseNumber": "SUP:784-5069"
            }
        ]
    }
    

    所以对于那些正在研究如何使用 SDK 做一些事情的人来说,不幸的是我无法弄清楚使用它的索引部分。我们仍然使用 SDK 来查询数据没有问题。

    【讨论】:

      【解决方案2】:

      所以,我能够找到的另一件事是在字符串短语内的部分搜索未找到。例如,这是我原来的搜索查询字符串:

      $select=CaseNumber&search=5080&searchFields=CaseNumber
      

      结果:

      /$metadata#docs(CaseNumber)",
          "value": [
              {
                  "@search.score": 6.5489187,
                  "CaseNumber": "SUP238-5080"
              },
              {
                  "@search.score": 1.8920381,
                  "CaseNumber": "SUP:501-6432"
              },
              {
                  "@search.score": 1.8920381,
                  "CaseNumber": "SUP:505-532"
              },
              {
                  "@search.score": 1.8920381,
                  "CaseNumber": "SUP:509-1851"
              },
              {
                  "@search.score": 1.337873,
                  "CaseNumber": "SUP:784-5069"
              }
          ]
      }
      

      但如果我尝试以任何身份(使用 *、~ 或任何 RegEx)搜索 080,如下所示:

      1. $select=CaseNumber&search=080&searchFields=CaseNumber
      2. $select=CaseNumber&search=*080&searchFields=CaseNumber
      
      /$metadata#docs(CaseNumber)",
          "value": []
      }
      

      我们最终要做的是创建一个字符串列表,其中包含每个 CaseNumber 字段的排列,去掉第一个字符。例如:

      SUP2385080
      UP2385080
      P2385080
      2385080
      385080
      85080
      5080
      080
      

      这现在允许我们在字符串的“CaseNumbers”列表中搜索任何部分字符串匹配,并且似乎返回迄今为止最接近的匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 2023-04-10
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多