使用Phrase Suggester时遇到ElasticsearchIllegalArgumentException

时间:2015-12-04 21:41:29

标签: elasticsearch lucene

我正在尝试使用ElasticSearch 1.7.3为我公司的搜索引擎实现“你有意义”功能。我按照文档设置了一个Phrase Suggester并创建了一个自定义映射来支持它。

但是,当我执行_suggest查询时,我会得到ElasticsearchIllegalArgumentException[Suggester[simple_phrase] not supported]。我做错了什么?

这是我的疑问:

POST knowledge_graph/entities/_suggest
{
  "suggest": {
    "text" : "apple in",
    "simple_phrase": {
      "phrase" : {
        "field" : "canonical_name"
      }
    }
  }
}

我收到以下回复:

{
  "_shards": {
    "total": 5,
    "successful": 0,
    "failed": 5,
    "failures": [
      {
        "index": "knowledge_graph",
        "shard": 0,
        "status": 500,
        "reason": "BroadcastShardOperationFailedException[[knowledge_graph][0] ]; nested: ElasticsearchException[failed to execute suggest]; nested: ElasticsearchIllegalArgumentException[Suggester[simple_phrase] not supported]; "
      },
      ...
    ]
  }
} 

这是我索引的设置和映射:

{
  "knowledge_graph": {
    "aliases": {},
    "mappings": {
      "entities": {
        "properties": {
          "autocomplete": {
            "type": "completion",
            "analyzer": "simple",
            "payloads": true,
            "preserve_separators": true,
            "preserve_position_increments": true,
            "max_input_length": 50
          },
          "canonical_name": {
            "type": "string",
            "analyzer": "simple",
            "fields": {
              "shingles": {
                "type": "string",
                "analyzer": "simple_shingle_analyzer"
              }
            }
          },
          "entity_query": {
            "properties": {
              "simple_phrase": {
                "properties": {
                  "phrase": {
                    "properties": {
                      "field": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "text": {
                "type": "string"
              }
            }
          },
          "suggest": {
            "properties": {
              "simple_phrase": {
                "properties": {
                  "phrase": {
                    "properties": {
                      "field": {
                        "type": "string"
                      }
                    }
                  }
                }
              },
              "text": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1449251691345",
        "analysis": {
          "filter": {
            "shingles_1_6": {
              "type": "shingle",
              "max_shingle_size": "6",
              "output_unigrams_if_no_shingles": "true"
            }
          },
          "analyzer": {
            "simple_shingle_analyzer": {
              "type": "custom",
              "filter": [
                "lowercase",
                "shingles_1_6"
              ],
              "tokenizer": "standard"
            }
          }
        },
        "number_of_shards": "5",
        "number_of_replicas": "0",
        "version": {
          "created": "1070399"
        },
        "uuid": "g_Yp7z6kQHCDRtd6TvVlzQ"
      }
    },
    "warmers": {}
  }
}

1 个答案:

答案 0 :(得分:1)

有两种方法可以执行suggest个请求,一个使用_search个端点,另一个使用_suggest个端点。

来自Docs

  

建议对_suggest端点执行的请求应该省略   周围的建议元素,仅在建议时使用   请求是搜索的一部分。

如果您针对_search api

执行查询,那么您的查询将会有效
POST knowledge_graph/entities/_search <---- here
{
  "suggest": {
    "text" : "apple in",
    "simple_phrase": {
      "phrase" : {
        "field" : "canonical_name"
      }
    }
  },
   "size" : 0
}

如果您想使用_suggest端点进行查询,请尝试使用

POST knowledge_graph/_suggest
{
  "suggest": {
    "text": "apple in",
    "phrase": {
      "field": "canonical_name"
    }
  }
}

注意 - 我认为你应该对 canonical_name.shingles 执行短语建议