当前,我们正在使用查询在MSSQL中执行全文搜索:
select * from contract where number like 'word%'
问题在于contract number
可能像
АА-1641471
TST-100069
П-5112-90-00230
001-1000017
1617/292/000001
ES将所有这些都拆分为令牌。
如何配置ES使其不将所有contract numbers
拆分为令牌并像上面的SQL查询一样执行相同的搜索?
我找到的最接近的解决方案是执行以下查询:
{
"size": 10,
"query": {
"regexp": {
"contractNumber": {
"value": ".*п-11.*"
}
}
}
}
此解决方案的工作方式与MSSQL LIKE 'word%'
相同,其中value
像1111
,2568
等,但失败了,п-11
答案 0 :(得分:0)
一种选择是使用通配符查询,该查询可以执行任何类型的通配符组合,即%val%,%val或val%
{
"query": {
"wildcard" : { "contractNumber" : "*11" }
}
}
注意:不建议在搜索中以通配符开头。可能会非常慢
要使其与字符串值一起使用以防止其被标记,您需要更新索引并告诉分析器不要使用。一种方法是将属性定义为类型keyword
而不是text
PUT /_template/template_1
{
"index_patterns" : ["your_index*"],
"order" : 0,
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"your_document_type" : {
"properties" : {
"contractNumber" : {
"type" : "keyword"
}
}
}
}
注意:将your_index替换为索引名称,将your_document_type替换为文档类型。
添加映射后,删除当前索引并重新创建它,它将使用模板作为属性,并且您的contractNumber将作为关键字索引