如何添加自定义分析器来映射ElasticSearch-2.3.5进行部分搜索?

时间:2017-02-09 13:52:31

标签: elasticsearch

我使用ElasticSearch-2.3.5。我想在索引创建时将我的自定义分析器添加到映射。

PUT /library

{
  "settings": {
    "analysis": {
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "nGram",
          "min_gram": "1",
          "max_gram": "15",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      },
      "analyzer": {
        "index_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "ngram_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "search_term_analyzer": {
        "type": "custom",
        "tokenizer": "keyword",
        "filter": "lowercase"
      }
    }
  },
  "mappings": {
      "book": {
        "properties": {
          "Id": {
            "type": "long",
            "search_analyzer": "search_term_analyzer",
            "index_analyzer": "index_ngram_analyzer",
            "term_vector":"with_positions_offsets"
          },
          "Title": {
            "type": "string",
            "search_analyzer": "search_term_analyzer",
            "index_analyzer": "index_ngram_analyzer",
            "term_vector":"with_positions_offsets"
          }
        }
      }
    }
}

我从official guide获取了一个模板示例。

{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "type1" : {
            "properties" : {
                "field1" : { "type" : "string", "index" : "not_analyzed" }
            }
        }
    }
}

但是我在尝试执行代码的第一部分时遇到错误。有我的错误:

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "analyzer [search_term_analyzer] not found for field [Title]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [book]: analyzer [search_term_analyzer] not found for field [Title]",
    "caused_by": {
      "type": "mapper_parsing_exception",
      "reason": "analyzer [search_term_analyzer] not found for field [Title]"
    }
  },
  "status": 400
}

如果我将mappings放在settings内,我可以这样做,但我认为这是错误的方式。所以我尝试使用标题的一部分找到我的书。我有#A;亚瑟王"以书为例。我的查询如下:

POST /library/book/_search

{
    "query": {
        "match": {
            "Title": "kin"
        }
    }
}

什么都没找到。我做错了什么?你可以帮帮我吗?我的分析器和标记器似乎不起作用。如何获得条款" k"," i"," ki"," king"等等。?因为我认为我现在只有两个任期。有王'和'亚瑟'。

1 个答案:

答案 0 :(得分:1)

您错放了search_term_analyzer分析器,它应位于analyzer部分

PUT /library
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "nGram",
          "min_gram": "1",
          "max_gram": "15",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      },
      "analyzer": {
        "index_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "ngram_tokenizer",
          "filter": [
            "lowercase"
          ]
        },
        "search_term_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": "lowercase"
        }
      }
    }
  },
  "mappings": {
      "book": {
        "properties": {
          "Id": {
            "type": "long",         <---- you probably need to make this a string or remove the analyzers
            "search_analyzer": "search_term_analyzer",
            "analyzer": "index_ngram_analyzer",
            "term_vector":"with_positions_offsets"
          },
          "Title": {
            "type": "string",
            "search_analyzer": "search_term_analyzer",
            "analyzer": "index_ngram_analyzer",
            "term_vector":"with_positions_offsets"
          }
        }
      }
    }
}

另请确保使用analyzer代替index_analyzer,后者已在ES 2.x中弃用