bon*_*nez 3 regex lucene elasticsearch
我在ElasticSearch v1.2.1中有一些文档,如:
{
"tempSkipAfterSave": "false",
"variation": null,
"images": null,
"name": "Dolce & Gabbana Short Sleeve Coat",
"sku": "MD01575254-40-WHITE",
"user_id": "123foo",
"creation_date": null,
"changed": 1
}
Run Code Online (Sandbox Code Playgroud)
其中sku可以是一个变化,例如:MD01575254-40-BlUE,MD01575254-38-WHITE
我可以使用弹性搜索查询来处理这个问题:
{
"size": 1000,
"from": 0,
"filter": {
"and": [
{
"regexp": {
"sku": "md01575254.*"
}
},
{
"term": {
"user_id": "123foo"
}
},
{
"missing": {
"field": "project_id"
}
}
]
},
"query": {
"match_all": {}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了sku的所有变化: MD01575254*
然而,破折号' - '真的搞砸了我
当我将正则表达式更改为:
"regexp": {
"sku": "md01575254-40.*"
}
Run Code Online (Sandbox Code Playgroud)
我无法得到任何结果.我也试过了
只是似乎无法使它工作?这里我没有错?
问题:
这是因为默认分析器通常标记为-,因此您的字段最像保存,如:
MD0157525440BlUE解:
您可以更新映射以使sku.raw索引时不会分析的字段.这将要求您删除并重新编制索引.
{
"<type>" : {
"properties" : {
...,
"sku" : {
"type": "string",
"fields" : {
"raw" : {"type" : "string", "index" : "not_analyzed"}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以查询未分析的新字段:
{
"query" : {
"regexp" : {
"sku.raw": "md01575254-40.*"
}
}
}
Run Code Online (Sandbox Code Playgroud)
HTTP端点:
删除当前映射和数据的API是:
DELETE http://localhost:9200/<index>/<type>
Run Code Online (Sandbox Code Playgroud)
使用原始SKU添加新映射的API是:
PUT http://localhost:9200/<index>/<type>/_mapping
Run Code Online (Sandbox Code Playgroud)
链接:
| 归档时间: |
|
| 查看次数: |
2428 次 |
| 最近记录: |