【问题标题】:Elasticsearch Mapping and Settings definitionsElasticsearch 映射和设置定义
【发布时间】:2017-02-23 19:17:20
【问题描述】:

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

这是我使用的代码:

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 的希腊语言分析器,我应该得到相同的条目,但我没有.

知道为什么吗?在索引文档时我应该做更多的事情吗?阅读文档后,我的印象是,在为一段文本建立索引时定义映射后,它会自动被双向索引,并且每次都会使用适当的分析器自动分析查询。

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

提前谢谢你。

【问题讨论】:

    标签: elasticsearch mapping analyzer


    【解决方案1】:

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

    首先:

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

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

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

    那么只有你的搜索查询会起作用

    【讨论】:

    • 当我尝试使用 POST 创建索引时,我得到: { "_index": "test", "_type": "text", "_id": "AVfDJVLHvgDv319PJqTd", "_version": 1 , "_shards": { "total": 2, "successful": 1, "failed": 0 }, "created": true } 另一方面,使用 PUT 我得到:没有为 uri 找到处理程序 [/test/article ] 和方法 [PUT] 知道为什么吗?当我创建 /test 而不是 /test/text 时,我得到:“type”:“mapper_parsing_exception”,“reason”:“[fields] 的映射定义具有不受支持的参数:[analysisr : greek]”
    • 由于我不想自定义希腊语分析器,我可以这样做:“mappings”:{“my_type_name”:{“properties”:{“title”:{“type”:“text” , "analyzer": "english" } } } } 而不是包括整个定义?
    • 创建索引时,您必须有PUT 并且只有索引的名称。创建文档时,您可以使用POST index/typePUT index/type/id。删除您的索引并从我上面的建议重新开始。
    • 当我尝试返回时:“root_cause”:[{“type”:“mapper_parsing_exception”,“reason”:“[fields] 的映射定义具有不受支持的参数:[分析器:希腊语] " } ]
    • 这是您的映射中的拼写错误,只需将 analyser 替换为 analyzer
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2012-07-11
    • 1970-01-01
    • 2015-12-03
    • 2012-09-04
    • 2016-03-15
    • 1970-01-01
    • 2013-08-31
    相关资源
    最近更新 更多