ElasticSearch在单词内搜索连字符

时间:2015-07-08 19:22:57

标签: search elasticsearch hyphen

我想请求帮助。我想在标题和内容中搜索单词。这是结构

'body' => array(
  'mappings' => array(
    'myindex' => array(
      '_source' => array(
        'enabled' => true
      ),
      'properties' => array(
        'Title' => array(
          'type'  => 'string',
          'fields'=> array(
            'raw' => array(
               'type'  => 'string',
               'index' => 'not_analyzed'
              )
            )
          ),
          'Content' => array(
            'type'  => 'string'
          ),
          'Image' => array(
             type'      => 'string',
             'analyzer'  => 'standard'
         )
       )
     )
   )
 )

查询字符串看起来像这样,我希望在“15-game”之类的文本中搜索“15-g”:

"query" : {
  "query_string": {
    "query": "*15-g*",
    "fields": [ "Title", "Content" ]
  }
}

如果我复制了这个问题,请接受我的道歉,但我无法知道发生了什么以及为什么它不会返回任何结果。

我已经看过了:

  

ElasticSearch - Searching with hyphens

     

ElasticSearch - Searching with hyphens in name

     

ElasticSearch - Searching with hyphens in name

但我无法与我合作。

真正有趣的是,如果我搜索“15-g”(15 空间 - 空间 g),它将返回结果。

提前非常感谢你!

2 个答案:

答案 0 :(得分:1)

.raw添加Content字段,然后在.raw字段中进行搜索:

{
  "query": {
    "query_string": {
      "query": "*15-g*",
      "fields": [
        "Title.raw",
        "Content.raw"
      ]
    }
  }
}

如果您要搜索的文字中有空格的任何地方,并且想要该空间与您的字段匹配,则需要对其进行转义(使用{{1} })。此外,只要您拥有大写字母和通配符,并且希望与\字段匹配,就需要将.raw设置为lowercase_expanded_terms,因为默认设置为{{1}它将小写搜索字符串(它将搜索false):

true

答案 1 :(得分:0)

在elasticsearch 5中,您可以使用过滤器设置定义自定义分析器。 以下是示例代码:

PUT test1
{
  "settings" : {
    "analysis" : {
      "analyzer" : {
        "myAnalyzer" : {
          "type" : "custom",
          "tokenizer" : "whitespace",
          "filter" : [ "dont_split_on_numerics" ]
        }
      },
      "filter" : {
        "dont_split_on_numerics" : {
          "type" : "word_delimiter",
          "preserve_original": true,
          "generate_number_parts" : false
        }
      }
    }
  },
  "mappings": {
    "type_one": {
      "properties": {
        "title": { 
          "type": "text",
          "analyzer": "standard"
        }
      }
    },
    "type_two": {
      "properties": {
        "raw": { 
          "type": "text",
          "analyzer": "myAnalyzer"
        }
      }
    }
  }
}

请知道我设置了

  

" preserve_original":是的   " generate_number_parts"

这样字符串" 2-345-6789"会保持原样。 Dash是elasticsearch中的保留字。如果没有上述设置,标准标记器将生成" 2"," 345"和" 6789"。所以,现在你可以使用" wildcard"搜索即。

  

" 5-67 "

获得结果。

POST test1/type_two/1
{
  "raw": "2-345-6789"
}

GET test1/type_two/_search
{
  "query": {
    "wildcard": {
      "raw": "*5-67*"
    }
  }
}

详细信息可在elastic search tokenfilter

找到