在Elasticsearch中,如何搜索任意子字符串?

时间:2017-06-27 22:44:03

标签: elasticsearch lucene

在Elasticsearch中,如何搜索任意子字符串,可能包括空格? (搜索单词的一部分还不够;我想搜索整个字段的任何子字符串。)

我想它必须位于keyword字段中,而不是text字段。

假设我的Elasticsearch索引中只有几千个文档,我尝试:

  "query": {
         "wildcard" : { "description" : "*plan*" }
  }

按预期工作 - 我得到描述中“计划”的每个项目,甚至像“取代”那样。

现在,我想做

  "query": {
         "wildcard" : { "description" : "*plan is*" }
  }   

...所以我可能会将文件与“Kaplan is not”等许多其他可能性相匹配。

对于我可能看到的通配符,匹配前缀或任何其他查询类型,这似乎是不可能的。如何只搜索任何子字符串? (在SQL中,我只会做description LIKE '%plan is%'

(我知道任何这样的查询对于大型数据集来说都会很慢或甚至不可能。)

2 个答案:

答案 0 :(得分:1)

您是否尝试过elasticsearch中的 regxp query ?这肯定听起来像你可能感兴趣的东西。

答案 1 :(得分:1)

我希望这个Elasticsearch可能内置一些内容,因为这个简单的子字符串搜索看起来像一个非常基本的功能(想一想,它在C中实现为strstr(),{{1}在SQL中,在大多数文本编辑器中为Ctrl + F,在C#中为LIKE '%%'等,但似乎并非如此。请注意,regexp查询不支持不区分大小写,因此我还需要将其与此自定义分析器配对,以便索引匹配全小写。然后我也可以将搜索字符串转换为小写字母。

String.IndexOf

示例查询:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "lowercase_keyword": { 
          "type": "custom",
          "tokenizer": "keyword", 
          "filter": [ "lowercase" ] 
        }
      }
    }
  },
  "mappings": { 
     ...
     "description": {"type": "text", "analyzer": "lowercase_keyword"},
  }
}

感谢Jai Sharma领导我;我只想提供更多细节。