2016-03-16 3 views
0

Я хотел бы рассчитать каждый проанализированный токен.Как получить анализируемое количество слов по Elasticsearch?

Во-первых, я попытался следующие коды:

отображение:

{ 
    "docs": { 
    "mappings": { 
     "doc": { 
     "dynamic": "false", 
     "properties": { 
      "text": { 
      "type": "string", 
      "analyzer": "kuromoji" 
      } 
     } 
     } 
    } 
    } 
} 

запрос:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "word-count": { 
     "terms": { 
     "field": "text", 
     "size": "1000" 
     } 
    } 
    }, 
    "size": 0 
} 

переспросила я мой индекс после вставки мои данные, я получил следующий результат:

{ 
    "took": 41 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 10000, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "word-count": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 36634, 
     "buckets": [ 
     { 
      "key": "はい", 
      "doc_count": 4734 
     }, 
     { 
      "key": "いただく", 
      "doc_count": 2440 
     }, 
     ... 
     ] 
    } 
    } 
} 

К сожалению, агрегирование сроков предоставляет только doc_count. Это не слово. Итак, я думаю, что способ получить приблизительный подсчет слов, используя _index['text']['TERM'].df() и _index['text']['TERM'].ttf().

Может быть приближенное количество слов является следующее уравнение:

WordCount = doc_count['TERM']/_index['text']['TERM'].df() * _index['text']['TERM'].ttf() 

'TERM' является ключевым в ведрах. Я попытался написать агрегирование с использованием сценариев, но я не знал, как получить ключи в ведрах.

{ 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "doc-count": { 
     "terms": { 
     "field": "text", 
     "size": "1000" 
     } 
    }, 
    "aggs": { 
     "word-count": { 
     "scripted_metric": { 
      // ??? 
     } 
     } 
    } 
    }, 
    "size": 0 
} 

Как я могу получить ключи в ведрах? Если это невозможно, как я могу получить анализируемое количество слов?

ответ

0

Вы можете попробовать с помощью типа данных token count. Просто добавьте подпол этого типа к вашему text полю:

{ 
    "docs": { 
    "mappings": { 
     "doc": { 
     "dynamic": "false", 
     "properties": { 
      "text": { 
      "type": "string", 
      "analyzer": "kuromoji" 
      }, 
      "fields": { 
      "nb_tokens": { 
       "type": "token_count", 
       "analyzer": "kuromoji" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Затем вы можете использовать text.nb_tokens в вашей агрегации.

+0

Спасибо! Я попытался подсчитать количество, но это не подходит для моего дела. Количество токенов подсчитывает токены каждого документа, но я хочу подсчитать один и тот же токен в целых документах. Например, текст «だ か ら で す ね» засчитывается в 3 жетона. Но я хочу получить «だ か ら», «で す», а «ね» подсчитывает каждый 1 токен и агрегирует токены в целых документах, чтобы получить каждый токен. –

0

Вы можете попробовать dynamic_scripting, хотя это будет влиять на производительность ..

{ 
"query": { 
"match_all": {} 
}, 
"aggs": { 
"word-count": { 
    "terms": { 
    "script": "_source.text", 
    "size": "1000" 
    } 
    } 
}, 
"size": 0 
} 
+0

Спасибо. Я попробовал ваш код, но он вернул «не проанализированный» счет фразы. Я хочу проанализировать количество токенов. –

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