ElasticSearch分析器,允许有和没有超时的查询

时间:2016-03-07 15:25:20

标签: elasticsearch

如何构建一个分析器,允许您使用查询字段而不使用连字符?

以下两个查询必须返回同一个人:

{
  "query": {
    "term": {
      "name": {
        "value": "Jay-Z"
      }
    }
  }
}

{
  "query": {
    "term": {
      "name": {
        "value": "jay z"
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您可以使用mapping character filter来替换带有空格的连字符。基本上,像这样:

curl -XPUT localhost:9200/tests -d '{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ],
          "char_filter": [
            "hyphens"
          ]
        }
      },
      "char_filter": {
        "hyphens": {
          "type": "mapping",
          "mappings": [
            "-=>\\u0020"
          ]
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}'

然后我们可以使用_analyze端点检查分析管道会产生什么:

Jay-Z

curl -XGET 'localhost:9200/tests/_analyze?pretty&analyzer=my_analyzer' -d 'Jay-Z'
{
  "tokens" : [ {
    "token" : "jay z",
    "start_offset" : 0,
    "end_offset" : 5,
    "type" : "word",
    "position" : 0
  } ]
}

jay z

curl -XGET 'localhost:9200/tests/_analyze?pretty&analyzer=my_analyzer' -d 'jay z'
{
  "tokens" : [ {
    "token" : "jay z",
    "start_offset" : 0,
    "end_offset" : 5,
    "type" : "word",
    "position" : 0
  } ]
}

正如您所看到的那样,两个表单的索引都会被编入索引,因此您的term查询也适用于这两种表单。