使用不同的查询和索引时间分析器创建一个elasticsearch索引

时间:2016-02-03 11:04:57

标签: elasticsearch

尽管有文档记载,但没有关于如何使用索引时间和不同的查询时间分析器创建索引的工作示例。

我希望仅对搜索应用同义词过滤器。如果我指定分析仪名称,我可以测试分析仪,但没有名称,它不会检测默认值。

可能出现什么问题?

"settings": {
      "index": {        
        "analysis": {
          "filter": {
            "synonym": {
              "type": "synonym",
              "synonyms": [
                "testword => otherword"
              ]
            }
          },
          "analyzer": {
            "default_search": {
              "filter": [
                "lowercase",
                "asciifolding",
                "synonym"
              ],
              "tokenizer": "standard"
            },
            "default_index": {
              "filter": [
                "lowercase",
                "asciifolding"
              ],
              "tokenizer": "standard"
            }
          }
        }

请注意两个不同的分析器,名为default_searchdefault_index。根据文档,这些应该被视为默认值。因此,如果我执行“testword”搜索,则会搜索“otherword”。

我可以确认在索引类型上设置了默认的分析器名称:

"myIndex": {
    "mappings": {
      "myType": {
        "index_analyzer": "default_index",
        "search_analyzer": "default_search",
        "properties": ...

我执行测试搜索:

在未指定分析器/myIndex/_analyze/?pretty=true&text=testword的情况下进行呼叫(期望按照配置提取default_search

{
  "tokens" : [ {
    "token" : "testword",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "<ALPHANUM>",
    "position" : 1
  } ]
}

使用特定分析器myIndex/_analyze/?analyzer=default_search&pretty=true&text=testword

进行呼叫
{
  "tokens" : [ {
    "token" : "otherword",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "SYNONYM",
    "position" : 1
  } ]
}

示例搜索,索引包含一个字段值为“otherword”的项目。下面的查询不返回任何结果,搜索“otherword”会返回所需的项目。 POST myIndex/_search

"query": {
  "multi_match": {
    "query": "testword",
    "analyzer": "default_search",
    "fields": [
      "name"      
    ]
  }
}

1 个答案:

答案 0 :(得分:1)

由于您正在调用_analyze端点,因此这不是搜索。您实际上是向ES发出请求,并要求它分析您提供的令牌流,就像ES正在索引那些令牌一样,因此默认的索引分析器会启动。

如果您想尝试default_search分析器,则需要向_search端点发送请求。

您需要使用otherword对文档编制索引,然后使用/_search?q=testword进行搜索,您将看到default_search分析符启动。

<强>更新

您没有正确定义默认分析器,即您需要在settings(不在mappings中)进行定义并正确命名(即default而不是{{ 1}})。

这是我用于测试的索引:

default_index

以下是我为测试编制索引的示例文档:

curl -XPUT localhost:9200/myindex -d '{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms": [
              "testword => otherword"
            ]
          }
        },
        "analyzer": {
          "default_search": {
            "filter": [
              "lowercase",
              "asciifolding",
              "synonym"
            ],
            "tokenizer": "standard"
          },
          "default": {
            "filter": [
              "lowercase",
              "asciifolding"
            ],
            "tokenizer": "standard"
          }
        }
      }
    }
  },
  "mappings": {
    "myType": {
      "properties": {
        "name": {
          "type": "string"
        }
      }
    }
  }
}'

然后使用以下查询而不指定任何分析器,我可以找到上面的文档:

curl -XPUT localhost:9200/myindex/myType/1 -d '{
  "name": "otherword"
}'

响应:

curl -XPOST localhost:9200/myindex/myType/_search -d '{
  "query": {
    "multi_match": {
      "query": "testword",
      "fields": [
        "name"
      ]
    }
  }
}'