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

时间:2018-06-13 01:31:45

标签: lucene odata azure-search azure-search-.net-sdk

我有一个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(字符串)中?我想避免一个新的reindex过程。提前谢谢。

更新

使用集合和新数据集:

{
    "@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

2 个答案:

答案 0 :(得分:1)

使用Kvp:"999||education"

围绕您的查询使用phrase search

分析仪确实删除了|字符,所以这实际上相当于Kvp:"999 education"。要理解的是分析是如何工作的。你索引的是什么,当你索引:" 1234 ||| student,5678 || blue,999 || metallica",是六个词:

  • 1234
  • 学生
  • 5678
  • 蓝色
  • 999
  • METALLICA

和查询不起作用,因为它在字段中查找该列表中任何位置的匹配项,从而匹配id 5.订单或邻接不被视为短语查询。

正则表达式查询不起作用,因为它必须匹配单个术语中的所有内容。 Kvp:999.*education因为" 999"而无法工作和#34;教育"被分析成单独的术语,因此没有与该正则表达式匹配的单个术语

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

  • 1234 ||学生,
  • 5678 ||蓝色,
  • 999 || METALLICA,

这对你来说可能是一个解决方案,但却无法有效地搜索" metallica"。

答案 1 :(得分:0)

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