Я думаю, что это зависит от того, как у вас есть ваши данные индексируются и какие требования вы должны при поиске. Например, если у вас есть «косвенная зеленая энергия, чтобы сэкономить» (то есть «зеленый» и «энергия» близки друг к другу), и вы хотите, чтобы ваш сценарий «соответствовал» для «зеленой энергии» и дал вам 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()
. В моем примере я предположил, что вы хотите найти точный термин «зеленая энергия», поэтому я использовал «черепицу», который для текста в качестве примера выше приводит к анализу списка таких терминов, как это: "content.with_shingles": ["energy to","green energy","indirect green","to spare"]
.
Отлично, большое спасибо. Просто примечание для других ребят: не забудьте URL кодировать ваш запрос json. «зеленая энергия» должна стать «зеленой + энергией», –