ElasticSearch 在单词中使用连字符进行搜索

ElasticSearch searching with hyphen inside a word

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

'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" ]
  }
}

如果我重复这个问题,请接受我的道歉,但我无法找出发生了什么以及为什么它没有 return 任何结果。

我已经看过了:

ElasticSearch - Searching with hyphens in name

ElasticSearch - Searching with hyphens in name

但我不能和我一起工作。

真正有趣的是,如果我搜索“15 - g”(15space-spaceg) 它 return 结果。

在此先感谢您!

也将 .raw 字段添加到您的 Content 并在 .raw 字段上进行搜索:

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

任何你想要搜索的文本中有 space 并且你想要 space要匹配您的字段,需要对其进行转义(使用 \)。此外,任何时候你有大写字母和通配符并且你想像这样与 .raw 字段匹配,你需要将 lowercase_expanded_terms 设置为 false,因为默认情况下该设置为 [=19] =],它将小写搜索字符串(它将搜索 laptop - black):

{
  "query": {
    "query_string": {
      "query": "*Laptop\ -\ Black*",
      "lowercase_expanded_terms": false, 
      "fields": [
        "Title.raw",
        "Content.raw"
      ]
    }
  }
}

在 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": true "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