我希望从多个单词中获取一个由两个单词组合而来的频率 例如"绿色能源"
我可以访问"绿色"和"能源",例如:
"function_score":
{
"filter" : {
"terms" : { "content" : ["energy","green"]}
},
"script_score": {
"script": "_index['content']['energy'].tf() + _index['content']['green'].tf()",
"lang":"groovy"
}
}
这很好用。但是,我怎样才能找到一个术语的频率"绿色能源"如
_index['content']['green energy'].tf()
不起作用
答案 0 :(得分:1)
我认为这取决于您的数据索引方式以及搜索时的要求。例如,如果你有"间接绿色能源备用" (意思是,"绿色"和"能量"彼此相近),你希望你的脚本能够匹配"为了绿色能源"并给你一个tf()评估,然后你需要相应地索引你的数据。就像你说的那样 - "术语的频率'绿色能源'"归结为以某种方式产生这个术语"绿色能源"。
在您的情况下,一个想法是使用"content"
的另一个字段,但使用"shingles"
分析器:
PUT /some_index
{
"settings": {
"analysis": {
"filter": {
"my_shingle_filter": {
"type": "shingle",
"min_shingle_size": 2,
"max_shingle_size": 2,
"output_unigrams": false
}
},
"analyzer": {
"my_shingle_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_shingle_filter"
]
}
}
}
},
"mappings": {
"some_type": {
"properties": {
"content": {
"type": "string",
"index": "analyzed",
"fields": {
"with_shingles": {
"type": "string",
"analyzer": "my_shingle_analyzer"
}
}
}
}
}
}
}
在您的功能评分中,您会引用.with_shingles
字段:
{
"query": {
"function_score": {
"filter": {
"terms": {
"content": [
"energy",
"green"
]
}
},
"script_score": {
"script": "_index['content.with_shingles']['green energy'].tf()",
"lang": "groovy"
}
}
}
}
这只是一个示例,可以证明您需要相应地索引数据,以便获得所需的.tf()
。在我的例子中,我假设你想要搜索确切的术语"绿色能源"所以我用了#34;带状疱疹"对于上面的示例文本,会生成一个分析的术语列表,如下所示:"content.with_shingles": ["energy to","green energy","indirect green","to spare"]
。