Lucene azure搜索-通过双管道连接的筛选器键值对

Lucene azure搜索-通过双管道连接的筛选器键值对,lucene,odata,azure-cognitive-search,azure-search-.net-sdk,Lucene,Odata,Azure Cognitive Search,Azure Search .net Sdk,我有一个EDM.string字段,用于存储由“| |”和逗号分隔的键值对。例如: { "CustomField": "1234|||student, 5678||blue, 999||metallica, etc..." } search=5678 blue&searchFields=CustomField&searchMode=all&queryType=full 我需要执行查询以提取键值组合。例如: { "CustomField": "1234||

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

{
    "CustomField": "1234|||student, 5678||blue, 999||metallica, etc..."
}
search=5678 blue&searchFields=CustomField&searchMode=all&queryType=full
我需要执行查询以提取键值组合。例如:

{
    "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.集合(字符串)中?我希望避免新的重新索引过程。提前谢谢

更新

使用集合和新数据集:

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

我不认为正则表达式是最有效的方法,因为我们不会对您的情况进行全文搜索。如果您希望检索键/值组合,将所有不同的键/值放在可搜索的集合中是否更有意义?这样,您就可以轻松地搜索“5678 | |蓝色”。尽管如此,您确实不需要管道(| |).

用引号将查询括起来:
Kvp:“999 | | |教育”

分析器确实删除了|字符,因此这实际上相当于
Kvp:“999教育”
。要理解的是分析是如何工作的。当你索引“1234 | | | |学生,5678 | |蓝色,999 | | |金属色”时,你在这里索引的是六个术语:

  • 1234
  • 学生
  • 5678
  • 蓝色的
  • 999
  • 金属
and查询不起作用,因为它在该列表中的任何位置、字段中查找匹配项,从而匹配id 5。顺序或邻接关系不像短语查询那样被考虑

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


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

  • 1234 | |学生
  • 5678 | |蓝色
  • 999 | | metallica

这对您来说可能是一个解决方案,但会使您无法高效地搜索“metallica”。

如果不更新索引和重新索引内容,我看不到解决搜索方案的方法。我认为关键是创建适当的令牌,以允许搜索唯一的密钥/值对。这可以使用自定义分析器来完成。或者只是使用一个集合……经过几天的尝试,我意识到我需要再次更改索引。我尝试使用集合,但不允许使用许多有用的函数,例如match、indexof,这使得解决此问题非常困难。@Mr.Kraus我已经用另一个示例数据更新了问题。我也尝试过集合,但也不起作用。我可以有一个kvp作为“5678 | |深蓝色”,用户可以搜索“蓝色”,我想匹配两个键5678。问题是,如果我允许开放搜索,它可以在另一个kvp上找到蓝色,这是我想要避免的。使用集合和默认分析器,正则表达式将解决?是否有办法拆分5678键,搜索蓝色?是否有办法启用集合的函数匹配、索引?感谢您的解释,但是它不会使用Kvp返回任何行:“999 | | education”。您给出的第二个选项是,我需要重新为内容编制索引,还是只需向索引中添加另一个分析器?我找不到有关此的任何示例。在执行搜索时,如何更改分析器?使用空白分析器,它为给定字符串返回4个结果:“1234 | | sepultura,999 | | programmer,876 | | no education”。因为我在“否”和“教育”之间有一个空格。1-是的,如果要更改分析器,需要重新编制索引。您可以在不重新编制索引的情况下更改查询分析器,但这不会更改文档本身的索引方式。2-没有注意到这些字段中有空格,所以不,空格不能用作分析器。我认为关键字在将它们添加为列表时可能会起作用。我创建了一个自定义的分析器,如下所示:index.Analyzers=new Analyzer[]{new patternalyzer(“customPatternTh”,小写:true,pattern:@“(\w+\ \ \ \ \ \ \ \”([^\s]+)”};我已将自定义分析器设置为该字段的默认值,并重新索引了内容,但它无法使用示例Kvp找到任何文档:“999 | | education”。有什么建议吗?