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

Posted

技术标签:

【中文标题】ElasticSearch 在单词中使用连字符进行搜索【英文标题】:ElasticSearch searching with hyphen inside a word 【发布时间】:2015-09-26 21:43:58 【问题描述】:

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

'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”(15space-spaceg),它会返回结果。

非常感谢您!

【问题讨论】:

【参考方案1】:

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


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

在您想要搜索的文本中有 空格 并且您想要该空格以匹配您的字段时,需要对其进行转义(使用 \) .此外,只要您有大写字母和通配符,并且想要与.raw 字段匹配,您需要将lowercase_expanded_terms 设置为false,因为默认情况下该设置为true,它将小写搜索字符串(它将搜索laptop - black):


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

【讨论】:

谢谢@Andrei,它有效!如果我想搜索两个或更多的词怎么办。 “笔记本电脑 - 黑色”可以说我有“Windows 笔记本电脑 - 黑色”,我想用“笔记本电脑 - 黑色”找到它。再次感谢你。问候。 在您想要搜索的文本中有 空格 并且您想要 匹配您的字段的任何地方,都需要对其进行转义。此外,只要您有大写字母和通配符,并且想要与.raw 字段匹配,您需要将lowercase_expanded_terms 设置为false,因为它将小写搜索字符串。更新了我的回复。 非常感谢@Andrei。我感谢你的努力。一切都按照您的解释进行。 :) 您能告诉我如何使搜索不区分大小写吗?问候【参考方案2】:

在 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”。因此,现在您可以使用“通配符”搜索,即。

"5-67"

得到结果。

POST test1/type_two/1

  "raw": "2-345-6789"


GET test1/type_two/_search

  "query": 
    "wildcard": 
      "raw": "*5-67*"
    
  

详细信息可以在elastic search tokenfilter找到

【讨论】:

以上是关于ElasticSearch 在单词中使用连字符进行搜索的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch terms aggs初探

使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?

如何使用 ElasticSearch 搜索单词的一部分

ElasticSearch如何使用 ElasticSearch 搜索单词的一部分 模糊搜索 正则匹配 前缀匹配

ElasticSearch-搜索查询

ElasticSearch n-gram tokenfilter 未找到部分单词