0

我正在学习使用 azure 搜索,但我找不到在 ItemId 字段中搜索带有中间破折号的术语的方法,不在乎要搜索的术语是在开头还是在中间。

我的索引中有这些字段和数据

+-----+--------------------+-------------+
| Cat |       ItemId       | Description |
+-----+--------------------+-------------+
| 100 |  400800-1100103U   | desc item 1 |
| 100 |  400800-11001066   | desc item 2 |
| 100 |  400800-11001068   | desc item 3 |
| 101 |  400800-110010F6   | desc item 4 |
+-----+--------------------+-------------+

这是我的索引字段配置:

+-------------+-------------+-----------+-----------+-----------+------------+
| Field Name  | Retrievable | Filerable |  Sortable | Facetable | Searchable |
+-------------+-------------+-----------+-----------+-----------+------------+
| Cat         |    OK       |    OK     |    OK     |    OK     |    X       |
| ItemId      |    OK       |    OK     |    OK     |    OK     |    OK      |
| Description |    OK       |           |           |           |            |
+-------------+-------------+-----------+-----------+-----------+------------+

这是我对字段 ItemId 的自定义分析器,即使有中间破折号,也只生成一个标记。

{
  "@odata.type": "#Microsoft.Azure.Search.CustomAnalyzer",
  "name": "keyword_lowercase",
  "tokenizer": "keyword_v2",
  "tokenFilters": [
    "lowercase"
  ],
  "charFilters": []
}

如果我用这个查询搜索:$select=RowKey&search=400800-1100*

我得到这些结果:

  • 400800-1100103U
  • 400800-11001066
  • 400800-11001068
  • 400800-110010F6

但是,如果我尝试使用这样的中间词进行搜索:$select=RowKey&search=RowKey:(00800-1100*)~

我得到 0 个结果。

那么如何在ItemId中搜索带有中间破折号的术语,而不关心搜索它的术语是在开头还是在中间?

4

2 回答 2

2

我删除分析器并使用请求正文中的此代码通过 POST 更改 GET。

{  
    "queryType": "full",
    "search": "/.*00-11.*/",
    "searchFields": "ItemId",
    "select": "ItemId",
    "count": true,
    "top": 10
} 

使用 Lucene 语法分析器和正则表达式的完整查询属性,搜索按预期工作。

请注意,如果您尝试在 azure 的查询搜索资源管理器中使用此正则表达式,则不会返回任何结果。我认为这是因为搜索浏览器使用 GET 请求。

感谢您的回答 Corom - MSFT。有用。我只想更清楚地回答

于 2020-01-24T17:34:31.640 回答
1

我相信这篇文章通过使用正则表达式搜索来回答您的问题,但有一些注意事项。或者,您可以考虑使用模糊搜索或使用带有反向标记过滤器的 Edge N-gram 标记器,具体取决于您的具体情况。

于 2020-01-24T00:52:58.647 回答