0

我正在使用弹性搜索来索引包含两个字段的实体:机构名称和机构地址。

假设我已经索引了一个实体:

{
    "agencyName": "Turismo Viajes",
    "agencyAddress": "Av. Maipú 500"
}

我希望能够搜索此实体并通过机构名称搜索上面的实体。不同的搜索可能是:

1) urismo 2) Viaje 3) Viajes 4) Turismo 5) uris

这个想法是,如果我用这些字符串进行查询,我应该总是得到那个实体(可能有不同的分数,具体取决于它的准确程度)。

为此,我认为 nGram 可以解决问题,因此我在我的弹性 search.yml 文件中定义了一个全局分析器,称为短语。

index:
  analysis:
    analyzer:
      phrase:
        type: custom
        tokenizer: nGram
        filter: [nGram, lowercase, asciifolding]

我创建了这样的代理索引:

{
  "possible_clients" : {
    "possible_client" : {
      "properties" : {
        "agencyName" : {
          "type" : "string",
          "analyzer" : "phrase"
        },
        "agencyAddress" : {
          "type": "string"
        }
}

问题是在拨打这样的电话时:

curl -XPOST 'http://localhost:9200/possible_clients/possible_client/_search' -d '{
    "query": { "term": { "agencyName": "uris" }}
}'

我没有受到任何打击。任何想法我做错了什么?

提前致谢。

4

2 回答 2

1

您正在使用术语查询进行搜索。术语查询始终未经分析。所以更换分析仪不会有任何影响。例如,您应该使用匹配查询。

于 2014-07-31T16:36:30.513 回答
0

根据文档,您的标记器的 max_gram 的默认值为 2。因此,您索引 tu、ur、ri、is、sm、mo 等。
术语过滤器不会分析您的输入,因此,您正在搜索对于 uris,并且 uris 从未被编入索引。

尝试设置一个 max_gram。:

ngram tokenizer ngram tokenfilter

也许您不应该同时使用 ngram 标记器和 ngram 过滤器。我总是只使用过滤器。(因为标记器是空格)

这是我们必须在这里定义的边缘图过滤器。Ngrams 应该是一样的。

"filter" : {    
"my_filter" : {
    "type" : "edgeNGram",
    "min_gram" : "1",
    "max_gram" : "20"
}
}

希望能帮助到你。

于 2013-09-27T07:17:11.250 回答