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 search:Kvp:"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=]。
我有一个 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 search:Kvp:"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=]。