我想要得到的数字,一个词的数目,匹配出现在我的一个点击,连同搜索结果。(例如,我想知道"hello“在"hello hi hello”中出现了2次)。
然而,我的问题更棘手,因为我想使用soundex作为过滤器。(例如,如果我搜索“伟大”并与“测试格栅很棒”匹配的话)。然后我想知道我的对手出现了2次,因为“伟大”在发音上完全相同“格栅”。
以下是我的索引:
{
"lecture" : {
"properties" : {
"transcript" : {
"type" : "string",
"analyzer" : "lecture_analyzer"
},
"file_id" : {
"type" : "string"
}
}
}
}lecture_analyzer看起来如下所示:
{
"tokenizer": "standard",
"filter": [
"dbl_metaphone",
]
}dbl_metaphone是我为语音匹配所用的
现在,当我发出以下查询时:
"query" : {
"bool" : {
"must" : [
{"match": { "transcript" :"grate"}},
{"term": { "file_id" : "21648371" }}
]
}
}我得到以下结果:
{
...
"hits" : {
"total" : 1,
"max_score" : 3.519093,
"hits" : [ {
...
"_id" : "21648371",
"_score" : 3.519093,
"_source" : {
"transcript" : "ok that's great, grate that carrot please",
"file_id" : "21648371"
}
} ]
}
}但是,我想知道我的术语“格栅”在我的中出现了两次:一次是“格栅”,一次是“很棒”,因为我使用了dbl_metaphone过滤器。
有人知道怎么做吗?
发布于 2016-08-12 03:56:05
这不是那么棘手,而是简单的术语计数问题。首先,您必须检查如何使用双元电话将“伟大”和“格拉夫”翻译成术语。
$ curl -s 'http://<HOST>/<INDEX>/_analyze?analyzer=lecture_analyzer&pretty' \
-d "ok that's great, grate that carrot please" \
| grep '"token"'你会得到
"token" : "AK",
"token" : "0TS",
"token" : "TTS",
"token" : "KRT",
"token" : "KRT",
"token" : "0T",
"token" : "TT",
"token" : "KRT",
"token" : "PLS",因此,您可以看到“伟大”,“格栅”和“胡萝卜”被编码为"KRT“使用双元电话机。
接下来,如何计算文档中的匹配数对于Elasticsearch来说并不是那么容易的问题。
一种方法是使用脚本字段。当使用Groovy作为脚本语言时,您可以通过_index[FIELD][TERM].tf()获得术语频率。
请注意,您必须在script.engine.groovy.inline.search: on中设置elasticsearch.yml以启用groovy脚本。
这是实际的查询。
{"query":{
... WRITE_YOUR_QUERY_HERE ...
},
"script_fields":{
"transcript_count":{
"script":"_index['transcript']['KRT'].tf()"
}
}
"_source":["*"],
}你得到的东西是
"fields":{
"transcript_count":[3]
}第二个不使用groovy的方法是使用术语向量。
这个细节是用下面的问题写的,所以我会省略。如何获得elasticsearch文档中每个单词的总数?
第三种方法是使用解释API。因为您使用{"match": { "transcript" :"grate"}}进行搜索,所以可以在搜索结果中使用Explain进行如下操作。
"description" : "tf(freq=3.0), with freq of:",
"details" : [ {
"value" : 3.0,
"description" : "termFreq=3.0",
"details" : [ ]
} ]给出了计算分数的详细方法,并在中间结果中显示了"KRT“的词频。
第一种方法不是很好的安全原因。第二和第三是不太好的表现。为了实现安全性和性能,您可能需要编写自己的插件。请参阅原生Java脚本
https://stackoverflow.com/questions/38908711
复制相似问题