首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从elasticsearch获得单个字段中的匹配数

从elasticsearch获得单个字段中的匹配数
EN

Stack Overflow用户
提问于 2016-08-12 01:59:55
回答 1查看 1.3K关注 0票数 0

我想要得到的数字,一个词的数目,匹配出现在我的一个点击,连同搜索结果。(例如,我想知道"hello“在"hello hi hello”中出现了2次)。

然而,我的问题更棘手,因为我想使用soundex作为过滤器。(例如,如果我搜索“伟大”并与“测试格栅很棒”匹配的话)。然后我想知道我的对手出现了2次,因为“伟大”在发音上完全相同“格栅”。

以下是我的索引:

代码语言:javascript
复制
{
    "lecture" : {  
        "properties" : {  
            "transcript" : {  
                "type" : "string",
                "analyzer" : "lecture_analyzer"
             },
            "file_id" : {
                "type" : "string"
            }
        }
    }
}

lecture_analyzer看起来如下所示:

代码语言:javascript
复制
{
    "tokenizer":  "standard",
    "filter": [
        "dbl_metaphone",
    ]
}

dbl_metaphone是我为语音匹配所用的

现在,当我发出以下查询时:

代码语言:javascript
复制
"query" : {
    "bool" : {
         "must" : [
              {"match": { "transcript" :"grate"}},
              {"term": { "file_id" : "21648371" }}
         ]
     }
}

我得到以下结果:

代码语言:javascript
复制
{
  ...
  "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过滤器。

有人知道怎么做吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-12 03:56:05

这不是那么棘手,而是简单的术语计数问题。首先,您必须检查如何使用双元电话将“伟大”和“格拉夫”翻译成术语。

代码语言:javascript
复制
$ curl -s 'http://<HOST>/<INDEX>/_analyze?analyzer=lecture_analyzer&pretty' \
-d "ok that's great, grate that carrot please" \
| grep '"token"'

你会得到

代码语言:javascript
复制
"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脚本。

参考资料:编写脚本高级脚本

这是实际的查询。

代码语言:javascript
复制
{"query":{
    ... WRITE_YOUR_QUERY_HERE ...
  },
 "script_fields":{
   "transcript_count":{
     "script":"_index['transcript']['KRT'].tf()"
   }
 }
 "_source":["*"],
}

你得到的东西是

代码语言:javascript
复制
"fields":{
  "transcript_count":[3]
}

第二个不使用groovy的方法是使用术语向量。

这个细节是用下面的问题写的,所以我会省略。如何获得elasticsearch文档中每个单词的总数?

第三种方法是使用解释API。因为您使用{"match": { "transcript" :"grate"}}进行搜索,所以可以在搜索结果中使用Explain进行如下操作。

代码语言:javascript
复制
"description" : "tf(freq=3.0), with freq of:",
"details" : [ {
"value" : 3.0,
"description" : "termFreq=3.0",
"details" : [ ]
} ]

给出了计算分数的详细方法,并在中间结果中显示了"KRT“的词频。

第一种方法不是很好的安全原因。第二和第三是不太好的表现。为了实现安全性和性能,您可能需要编写自己的插件。请参阅原生Java脚本

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38908711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档