ElasticSearch:如何以带标记字符串的MSSQL“ Like word%”执行搜索?

时间:2018-08-20 09:05:14

标签: sql-server elasticsearch

当前,我们正在使用查询在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%'相同,其中value11112568等,但失败了,п-11

1 个答案:

答案 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将作为关键字索引