azure search - 过滤由双管道连接的键值对

azure search - filter key value pair concatenated by double pipes

我有一个 EDM.string 字段,用于存储由“||”分隔的键值对和逗号。例如:

{
    "CustomField": "1234|||student, 5678||blue, 999||metallica, etc..."
}

我需要执行查询以提取键值组合。例如:

search=5678 blue&searchFields=CustomField&searchMode=all&queryType=full

使用正则表达式,我期待以下内容应该起作用:

search=/5678.*blue/&queryType=full&searchMode=all

我使用的是默认分析器,所以它似乎忽略了'||'。我试过使用正则表达式但没有成功。是否可以通过键值对查询,而不将其存储在 EDM.Collection(string) 上?我想避免一个新的重建索引过程。提前致谢。

更新

使用集合和新数据集:

{
    "@odata.context": "https://[service].search.windows.net/indexes('[index]')/$metadata#docs",
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.45867884,
            "uniqueid": "5",
            "Name": null,
            "Kvp": [
                "1234||sepultura",
                "999||programmer",
                "876||no education"
            ],
            "Kvp2": "1234||sepultura, 999 programmer, 876||no education"
        },
        {
            "@search.score": 0.38223237,
            "uniqueid": "1",
            "Name": null,
            "Kvp": [
                "1234||metallica",
                "999||horse education",
                "876||high school"
            ],
            "Kvp2": "1234||metallica, 999 horse education, 876||high school"
        },
        {
            "@search.score": 0.38223237,
            "uniqueid": "3",
            "Name": null,
            "Kvp": [
                "1234||john mayer",
                "999||kid education",
                "876||university"
            ],
            "Kvp2": "1234||john mayer, 999 kid education, 876||university"
        }
    ]
}

我的搜索查询如下:

Kvp: education&$count=true&queryType=full&searchMode=all

问题是我想避免检索 uniqueid 5。虽然其中一个标签的值是 "education",但它不是 999 键。

也尝试过:

Kvp: 999||education&$count=true&queryType=full&searchMode=all

Kvp: /.*999.*/ AND /.*education.*/&$count=true&queryType=full&searchMode=all

Kvp: /999.*education/&$count=true&queryType=full&searchMode=all

我不认为正则表达式是执行此操作的最有效方法,因为我们真的不会在您的案例中进行全文搜索。如果您要检索 key/value 组合,将所有不同的 key/value 放在可搜索的集合中是否更有意义?这样你就可以轻松地搜索“5678||blue”。虽然如果你这样做,你真的不需要管道 (||)。

通过用引号将您的查询括起来来使用 phrase searchKvp:"999||education"

分析器确实删除了 |字符,所以这实际上等同于 Kvp:"999 education"。要了解的是分析是如何工作的。您在这里索引的内容,当您索引:“1234|||student, 5678||blue, 999||metallica”时,是六个术语:

  • 1234
  • 学生
  • 5678
  • 蓝色
  • 999
  • 金属乐

and 查询不起作用,因为它会在字段中的该列表中的任何位置查找匹配项,从而匹配 id 5。不会像短语查询那样考虑顺序或邻接关系。

正则表达式查询不起作用,因为它必须匹配单个术语中的所有内容。 Kvp:999.*education 将不起作用,因为“999”和 "education" 被分析为单独的术语,因此没有 单个术语 匹配该正则表达式。


顺便说一句,另一种选择是更换分析仪。例如,如果您使用空白分析器,它会将索引术语更改为:

  • 1234||学生,
  • 5678||蓝色,
  • 999||金属乐队,

这可能是适合您的解决方案,但无法有效搜索 [​​=52=]。