1

我有一个 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 。尽管它具有“教育”作为其中一个标签的值,但它不是 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
4

2 回答 2

1

通过用引号括起您的查询来使用短语搜索Kvp:"999||education"

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

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

and 查询不起作用,因为它在该列表中的任何位置查找匹配项,在字段中,因此匹配 id 5。不考虑顺序或邻接,因为它们将用于短语查询。

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


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

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

这可能是您的解决方案,但无法有效地搜索“metallica”。

于 2018-06-13T15:25:10.367 回答
0

我不相信正则表达式会是最有效的方法,因为我们真的不会在您的情况下进行全文搜索。如果您要检索键/值组合,将所有各种键/值放在可搜索的集合中是否更有意义?这样您就可以轻松地搜索“5678||blue”。虽然如果你这样做,你真的不需要管道(||)。

于 2018-06-13T13:53:31.127 回答