空间不起作用的Elasticsearch正则表达式

时间:2015-05-21 16:11:54

标签: javascript regex elasticsearch whitespace

我们假设我的书籍标题为 ElasticSearch ,如下所示:

curl -XPUT "http://localhost:9200/_river/books/_meta" -d'
{
"type": "jdbc",
"jdbc": {
"driver": "org.postgresql.Driver",
"url": "jdbc:postgresql://localhost:5432/...",
"user": "...",
"password": "...",
"index": "books",
"type": "books",
"sql": "SELECT * FROM books"}

}“

例如,我有一本名为"Afoo barb"的书。

以下代码(搜索'.*foo.*')很好地回归了本书:

client.search({
  index: 'books',
  'from': 0,
  'size': 10,
  'body' : {
    'query': {
      'filtered': {
         'filter': {
           'bool': {
              'must': {
                'regexp': { title: '.*foo.*' }
               }
            }
          }
        }
     }
  }
});

但以下代码(搜索'.*foo bar.*')不会:

client.search({
  index: 'books',
  'from': 0,
  'size': 10,
  'body' : {
    'query': {
      'filtered': {
         'filter': {
           'bool': {
              'must': {
                'regexp': { title: '.*foo bar.*' }
               }
            }
          }
        }
     }
  }
});

我尝试用'\s''.*'替换空格,但它也不起作用。

我认为标题用术语(['Afoo', 'barb'])分隔,因此无法找到'.*foo bar.*'

如何让Elasticsearch在完整标题中搜索正则表达式?

1 个答案:

答案 0 :(得分:1)

  

Elasticsearch会将regexp应用于该字段的tokenizer生成的术语,而不是该字段的原始文本。

您可以使用不同的tokenizer为您的字段建立索引或定义正则表达式,使其返回所需的高分文档。

关键字标记符示例:

'regexp': { title: '*(foo bar)*' }