2014-10-28 2 views
0

Я хочу получить доступ к частоте фразы, объединенной из нескольких слов , например. «Зеленая энергия»elasticsearch phraze term frequency .tf(), содержащий несколько слов

я могу получить доступ к ТФУ «зеленый» и «энергия», пример:

"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() 

не работает

ответ

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

+0

Отлично, большое спасибо. Просто примечание для других ребят: не забудьте URL кодировать ваш запрос json. «зеленая энергия» должна стать «зеленой + энергией», –

Смежные вопросы