Elasticsearch映射和设置定义

时间:2016-10-14 11:13:24

标签: elasticsearch mapping analyzer

我尝试通过配置其映射和设置来设置新索引。

以下是我使用的代码:

POST /test/text
{
  "settings": {
    "analysis": {
      "filter": {
        "greek_stop": {
          "type":       "stop",
          "stopwords":  "_greek_" 
        },
        "greek_lowercase": {
          "type":       "lowercase",
          "language":   "greek"
        },
        "greek_stemmer": {
          "type":       "stemmer",
          "language":   "greek"
        }
      },
      "analyzer": {
        "greek": {
          "tokenizer":  "standard",
          "filter": [
            "greek_lowercase",
            "greek_stop",
            "greek_stemmer"
          ]
        }
      }
    }
  },
  "mappings": {
    "article": {
      "properties": {
        "title": {
          "type": "string",
          "fields": {
            "greek": {
              "type": "string",
              "analyser": "greek"
                }
              }
        },
        "content": {
          "type": "string",
          "fields": {
            "greek": {
              "type": "string",
              "analyser": "greek"
                }
              }
        },
        "indexed_date": {
          "type": "date",
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}

我使用了POST,因为我不太关心_id,因此ES给这个变量一个随机值,而不是使用PUT,我必须指定它的值。我为标题和内容创建了两个字段的原因是因为我希望有原始版本的文本和'停用词删除 - 词干'版本,以便能够在用户输入完全符合条件时加权更高它(而不是只存储单词的词干版)

用数据填充索引后,例如:

PUT /test/text
{
  "title": " ",
  "content": " ",
  "date": " "
}

我尝试过像这样的搜索查询:

GET /test/text/_search
{
    "query":{
        "multi_match":{
                "query":"όμορφος",
                "type":"most_fields",
                "fields":["content","content.greek","title","title.greek"]}}}

然后通过将查询更改为“μμορφη”,这些单词具有相同的词干版本“μμορφ”,因此由于ES的希腊语言分析器,我应该得到相同的条目,我不这样做。

知道为什么吗?索引我的文档时,我应该做些什么吗?在阅读完文档后,我认为在索引一段文本后定义映射后,它会自动获得两种方式的索引,并且每次都会使用适当的分析器自动分析查询。

如果我的印象正确,为什么我的查询不会返回相同的结果?有什么想法吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

要首先创建索引,您需要调用PUT test而不是POST /test/text。后者只需在名为text的新索引中创建类型为test的新文档,但使用默认设置和映射。

首先:

PUT /test
{
  "settings": {
    ...
  },
  "mappings": {
    ...
  }
}

然后您可以创建新文档(请注意,您的映射类型称为article,而不是text

POST /test/article
{
  "title": " ",
  "content": " ",
  "date": " "
}

然后只有您的搜索查询才能生效