2

请原谅我是 Elasticsearch 的新手,但我正在遵循此处的语音入门指南:语音匹配

我有以下

POST /app
{
    "settings": {
        "index": {
            "analysis": {
                "filter": {
                    "dbl_metaphone": {
                        "type": "phonetic",
                        "encoder": "double_metaphone"
                    }
                },
                "analyzer": {
                    "dbl_metaphone": {
                        "tokenizer": "standard",
                        "filter": "dbl_metaphone"
                    }
                }
            }
        }
    },
    "mappings": {
        "movie": {
            "properties": {
                "title": {
                    "type": "string",
                    "fields": {
                        "phonetic": {
                            "type": "string",
                            "analyzer": "dbl_metaphone"
                        }
                    }
                },
                "year": {
                    "type": "string",
                    "fields": {
                        "phonetic": {
                            "type": "string",
                            "analyzer": "dbl_metaphone"
                        }
                    }
                }
            }
        }
    } }

我通过这样做添加了一些结果:

POST /app/movie
{ "title": "300", "year": 2006"} & { "title":"500 days of summer", "year": "2009" }

我想通过输入以下查询来查询电影“300”:

POST /app/movie/_search
    {
        "query": {
            "match": {
                "title.phonetic": {
                    "query": "three hundred"
                }
            }
        }
    }

但我没有得到任何结果。如果将我的查询更改为“300”,尽管它工作得很好。

如果我做:

GET /app/_analyze?analyzer=dbl_metaphone&text=300
{
  "tokens": [
    {
      "token": "300",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<NUM>",
      "position": 0
    }
  ]
}

我看到只有一个数字令牌返回,而不是字母数字版本,例如:

GET /app/_analyze?analyzer=dbl_metaphone&text=three hundred
{
  "tokens": [
    {
      "token": "0R",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "TR",
      "start_offset": 0,
      "end_offset": 5,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "HNTR",
      "start_offset": 6,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

我的语音查询是否缺少我应该定义以获取数字和字母数字标记的内容?

4

2 回答 2

1

这是不可能的。双变音位是语音编码算法的一种形式。简而言之,它试图将发音相似的单词编码为相同的键。

这有助于搜索可能拼写不同但听起来相同的名称等术语。

正如您从算法中看到的那样, 双变音位会忽略数字/数字字符。你可以在这里阅读更多关于双变位的信息。

于 2015-12-15T01:26:56.473 回答
0

当搜索查询是 [Jodi Stynehaser] 时,语音匹配的更好情况是找到“Judy Steinheiser”。


如果您需要能够使用英语搜索数字,那么您需要在索引时创建一些同义词或替代文本,以便“300”和“300”都存储在 Elasticsearch 中。

找到/编写将整数转换为英语的函数应该不难。

在构建文档以摄取到 ES 时调用您的函数。

或者,用 Groovy 编写它,并在映射中将其称为Transform 脚本

于 2015-12-17T20:06:55.393 回答