我有一个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
答案 0 :(得分:1)
使用Kvp:"999||education"
分析仪确实删除了|字符,所以这实际上相当于Kvp:"999 education"
。要理解的是分析是如何工作的。你索引的是什么,当你索引:" 1234 ||| student,5678 || blue,999 || metallica",是六个词:
和查询不起作用,因为它在字段中查找该列表中任何位置的匹配项,从而匹配id 5.订单或邻接不被视为短语查询。
正则表达式查询不起作用,因为它必须匹配单个术语中的所有内容。 Kvp:999.*education
因为" 999"而无法工作和#34;教育"被分析成单独的术语,因此没有与该正则表达式匹配的单个术语。
顺便提一下,另一种选择是改变分析仪。例如,如果您使用空白分析器,它会将索引术语更改为:
这对你来说可能是一个解决方案,但却无法有效地搜索" metallica"。
答案 1 :(得分:0)
我不相信正则表达式是最有效的方法,因为我们真的不会在你的情况下进行全文搜索。如果您要检索键/值组合,将所有各种键/值放入可搜索的集合中会更有意义吗?这样你就可以轻松地搜索" 5678 || blue"。虽然如果你这样做,你真的不需要管道(||)。