没有通配符的ES搜索无法使用分析器获得结果

时间:2016-11-08 10:00:41

标签: elasticsearch

在这里阅读了official documentation和一些Q& A后,我仍然无法让我的Elasticsearch正确搜索没有通配符的部分单词。

我有大约470,000个公司的条目,并希望在开始输入公司名称时完成某种自动完成。

索引的创建方式如下:

{
  "lei-index" : {
    "aliases" : { },
    "mappings" : {
      "record" : {
        "properties" : {
          "LegalName" : {
            "type" : "text",
            "analyzer" : "legalname_analyzer",
            "search_analyzer" : "legalname_search"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "5",
        "provided_name" : "lei-index",
        "creation_date" : "1478597987141",
        "analysis" : {
          "filter" : {
            "legalname_filter" : {
              "type" : "edge_ngram",
              "min_gram" : "4",
              "max_gram" : "20"
            }
          },
          "analyzer" : {
            "legalname_analyzer" : {
              "filter" : [
                "legalname_filter",
                "lowercase"
              ],
              "type" : "custom",
              "tokenizer" : "legalname_tokenizer"
            },
            "legalname_search" : {
              "filter" : [
                "legalname_filter",
                "standard",
                "lowercase"
              ],
              "type" : "custom",
              "tokenizer" : "legalname_tokenizer"
            }
          },
          "tokenizer" : {
            "legalname_tokenizer" : {
              "token_chars" : [
                "letter"
              ],
              "min_gram" : "4",
              "type" : "edge_ngram",
              "max_gram" : "20"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "mUBvjn9BSBayrkvXSIXxQw",
        "version" : {
          "created" : "5000051"
        }
      }
    }
  }
}

当我知道寻找让我们说Hapag-Loyd时,我可以搜索" Hapag"得到3个结果" hapag loyd"," hapag-loyd"和" hapag loyd"

但我想存档我可以搜索" hapa"并且已经得到了结果。

http://localhost:9200/lei-index/record/_search?pretty&q=hapa

0结果

使用通配符我得到结果,包括hapag loyd,但我猜通配符在较大的索引中效率不高

http://localhost:9200/lei-index/record/_search?pretty&q=hapa *

我尝试使用关键字作为标记符并将过滤器保留在外,只使用标记生成器,但没有得到预期的结果。

测试分析仪:

curl -XPOST 'localhost:9200/lei-index/_analyze?pretty' -d '{ "analyzer": "legalname_analyzer", "text": "hapag"}'
{
  "tokens" : [
    {
      "token" : "hapa",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "hapa",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "hapag",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "word",
      "position" : 1
    }
  ]
}

如果有人能指出我的思路在哪里出错,那将会很棒,因为这是我第一次使用elasticsearch。

最后一件事,我与hapag-loyd无关,我只是在这里用它作为例子。

由于

1 个答案:

答案 0 :(得分:1)

在发出以下请求时,query_string查询的标准分析器会启动。

http://localhost:9200/lei-index/record/_search?pretty&q=hapa

那不是你想要的。相反,您需要指定LegalName字段,以便利用该字段的search_analyzer

http://localhost:9200/lei-index/record/_search?pretty&q=LegalName:hapa

另一种解决方案是保留您的查询,但使用您自己的查询字符串覆盖查询字符串的标准分析器:

http://localhost:9200/lei-index/record/_search?pretty&q=hapa&analyzer=legalname_search