【问题标题】:Indexing e-mails in Azure Search在 Azure 搜索中为电子邮件编制索引
【发布时间】:2021-01-04 22:20:54
【问题描述】:

我正在尝试最好地索引电子邮件消息、主题和电子邮件地址的内容。电子邮件可以包含文本和 HTML 表示。它们可以是任何语言,所以很遗憾我不能使用特定于语言的分析器。

由于我是新手,所以我有很多问题:

  • 首先我使用标准 Lucene 分析器,但经过一些测试和 检查我使用“简单”切换到的每个分析器 分析仪。标准一不允许我按域搜索 user@domain.com(它将userdomain.com 视为令牌)。在我的情况下,“简单”是不是最好的?
  • 如何处理电子邮件的 HTML 内容?我认为这应该是 可以在 Azure 搜索中做到这一点,但现在我想我需要 自己剥离 HTML 标签。
  • 我的用户不精通技术,我假设“简单”查询类型将是 对他们来说足够了。我希望他们输入一两个单词并找到消息 包含这个词/包含以这个词开头的词。从我的测试看来,我需要将* 附加到他们的查询中才能“开始”工作?

【问题讨论】:

    标签: azure lucene azure-cognitive-search


    【解决方案1】:

    如果您提供数据示例、索引和查询方式的示例,我会提供帮助。发生了什么,您有什么期待?

    标准的 lucene 分析器将适用于您的 user@domain.com 示例。它生成令牌 userdomain.com 是正确的。但是,当您查询时也会发生同样的情况,您将获得带有标记 userdomain.com 的记录。

    创建索引

        "fields": [
    
        {"name": "Id", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "sortable": true, "facetable": false, "key": true, "indexAnalyzer": null, "searchAnalyzer": null, "analyzer": null, "synonymMaps": [] }, 
        {"name": "Email", "type": "Edm.String", "filterable": true, "sortable": true, "facetable": false, "searchable": true, "analyzer": "standard"}
    ]
    

    上传

    {
        "value": [
            {
                "@search.action": "mergeOrUpload",
                "Id": "1",
                "Email": "user@domain.com"
            },
            {
                "@search.action": "mergeOrUpload",
                "Id": "2",
                "Email": "some.user@some-domain.com"
            },
            {
                "@search.action": "mergeOrUpload",
                "Id": "3",
                "Email": "another@another.com"
            }        
        ]
    }
    

    查询

    查询,使用 full 和 all。

    https://{{SEARCH_SVC}}.{{DNS_SUFFIX}}/indexes/{{INDEX_NAME}}/docs?search=user@domain.com&$count=true&$select=Id,Email&searchMode=all&queryType=full&api-version={{API-VERSION}}

    按预期产生结果(包含 userdomain.com 的所有记录):

    {
    "@odata.context": "https://<your-search-env>.search.windows.net/indexes('dg-test-65392234')/$metadata#docs(*)",
    "@odata.count": 2,
    "value": [
        {
            "@search.score": 0.51623213,
            "Id": "1",
            "Email": "user@domain.com"
        },
        {
            "@search.score": 0.25316024,
            "Id": "2",
            "Email": "some.user@some-domain.com"
        }
    ]
    

    }

    如果您的预期结果是只获得电子邮件完全匹配的上述记录,您可以改用短语搜索。 IE。用 search="user@domain.com" 替换上面的搜索参数,你会得到:

         {
            "@search.score": 0.51623213,
            "Id": "1",
            "Email": "user@domain.com"
         }
    

    您也可以使用关键字分析器。

    分析

    您可以通过 REST 直接比较不同的分析器。在 Email 属性上使用关键字分析器将生成一个标记。

        {
      "text": "some-user@some-domain.com",
      "analyzer": "keyword"
    }
    

    产生以下标记:

        "tokens": [
        {
            "token": "some-user@some-domain.com",
            "startOffset": 0,
            "endOffset": 25,
            "position": 0
        }
    ]
    

    与对大多数类型的非结构化内容做得不错的标准标记器相比。

        {
      "text": "some-user@some-domain.com",
      "analyzer": "standard"
    }
    

    对于电子邮件地址是某些通用文本的一部分的情况,这会产生合理的结果。

        "tokens": [
        {
            "token": "some",
            "startOffset": 0,
            "endOffset": 4,
            "position": 0
        },
        {
            "token": "user",
            "startOffset": 5,
            "endOffset": 9,
            "position": 1
        },
        {
            "token": "some",
            "startOffset": 10,
            "endOffset": 14,
            "position": 2
        },
        {
            "token": "domain.com",
            "startOffset": 15,
            "endOffset": 25,
            "position": 3
        }
    ]
    

    摘要

    这已经是一个很长的答案,所以我不会详细介绍您的其他两个问题。我建议将它们拆分为单独的问题,以便其他人受益。

    • HTML 内容:简而言之,您可以使用去除 HTML 标记的内置 HTML 分析器。或者您可以使用自定义代码自己剥离 HTML。我通常将 Beautiful Soup 用于此类用例,或者将简单的正则表达式用于更简单的情况。

    • 通配符搜索:通常用户不希望附加自动通配符。执行此操作的唯一应用程序是 Outlook 客户端,它会破坏精度。当我搜索“Jan”(一个通用名称)时,我烦人地收到所有在一月份发送的电子邮件(!)。搜索 Dan(同样是一个名字)我还收到了来自 Danmark(丹麦)的所有电子邮件。

    搜索中的一切都是准确率和召回率之间的权衡。在您使用电子邮件地址的第一个示例中,您的期望非常注重精确度。但是,在您的最后一个通配符问题中,您似乎更喜欢在所有内容上都使用通配符进行极端回忆。这一切都取决于您的期望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2022-12-28
      • 1970-01-01
      相关资源
      最近更新 更多