为所有查询实施ElasticSearch自定义过滤器

时间:2016-01-11 16:39:31

标签: elasticsearch configuration matching partial

我尝试从使用ElasticSearch 0.90.3升级到2.0并遇到一些问题。最初设置和配置ES的人不再可用,所以我很少知道它是如何工作的。

他们将ES 0.90.3配置为使用ElasticSearch-ServiceWrapper和Tire,除此之外,只有一些小的配置更改。

在大多数情况下,升级顺利,我更换了封顶部署过程中的设置信息,现在安装ES 2.0而不是0.90.3并且服务即将到来,但是,我无法获得部分匹配在上班前发生。我需要设置一个标准过滤器,适用于将使用部分匹配搜索所有字段的所有搜索。我已经完成了大量的谷歌搜索,这是我能提出的最接近的,但它仍然没有返回部分匹配。

index:
  settings:
    analysis:
      filter:
        autocomplete_filter:
          type: edge_ngram
          min_gram: 2
          max_gram: 32
      analyzer:
        autocomplete:
          type: custom
          tokenizer: standard
          filter: [ lowercase, autocomplete_filter ]

mappings:
  access_point_status:
    properties:
      text:
        type: string
        analyzer: autocomplete
        search_analyzer: standard

我希望不需要更换Tire,因为这会使升级更加复杂,但如果问题出在查询中而不是设置中,那么我将走这条路。这是一个未返回所需结果的示例查询:

curl -X GET 'http://localhost:9200/access_point_status/_search?from=0&size=100&pretty' -d 
'{ "query":
   { "bool":
     { "must": [
       { "match":
         { "_all":
           { "query":
             "1925","type":"phrase_prefix"
           }
         }
       }
    ]}
   }
   ,"sort": [ { "name":"asc" } ]
   ,"filter": { "term": { "domain":"domain_1" } }
   ,"size":100,"from":0
}'

由于

1 个答案:

答案 0 :(得分:0)

所以我发现了大部分问题。索引由Tire和data_tables使用不同的映射创建。一旦创建,就无法覆盖。

我创建了这些过滤器,然后将它们应用到字段

index:
  analysis:
    filter:
      edge_ngram_filter:
        type: edge_ngram
        min_gram: 2
        max_gram: 32
        side: front
    analyzer:
      character_only:
        type: custom
        tokenizer: standard
        filter: [ lowercase, edge_ngram_filter ]
      special_character:
        type: custom
        tokenizer: keyword
        filter: [ lowercase, edge_ngram_filter ]

我与95%的事情相匹配

curl -X GET 'http://localhost:9200/access_point_status/_search from=0&size=100&pretty' -d '
{
  "query":
  {
    "bool":
    {
      "must":[
      {
        "prefix":
        {
          "_all":"bsap-"
        }
      }]
    }
  },"sort":[
  {
    "name":"asc"
  }],"filter":
  {
    "term":
    {
      "domain":"domain_1"
    }
  },"size":100,"from":0
}'

我唯一缺少的是匹配特殊字符,不匹配大写字符。我尝试了几种类型的查询,query_string似乎与任何部分都不匹配。有人对其他问题有什么想法吗? 我需要匹配mac地址,ip,然后组合文本/数字字段和-_,。作为分隔符。