Сохранение частот токенов в elasticsearch вместо хранения текста

#python #elasticsearch #tokenize #word-frequency

#python #elasticsearch #маркировать #частота слов

Вопрос:

Насколько я понимаю из чтения документов, принцип работы elasticsearch заключается в том, что он подсчитывает частоту терминов * частоту терминов в отдельности. Он преобразует текст в своего рода словарь частот терминов, который также включает индексы местоположений, где эти термины встречаются наиболее часто.

То, что я пытаюсь сделать, это сохранить не текст, а частоты терминов для каждой строки данных. Поиск работает нормально, когда я просто загружаю полный текст, но он не будет хорошо работать в полномасштабном решении с более чем 10 миллионами страниц текста. Не было бы более эффективным хранить частоты терминов только в том случае, если текстовое содержимое в противном случае не имеет значения?

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

Комментарии:

1. Кто-нибудь? Это критически важно для моего приложения.

Ответ №1:

Для ваших целей вы могли бы реализовать termvector в текстовом поле для частот терминов. Пожалуйста, прочтите документацию здесь. Тогда вы могли бы использовать массовый запрос для termvector, который является mtermvector- doc here, и документ python api. Он работает со списком идентификаторов. Например, если у вас есть список всех идентификаторов ваших документов, которые соответствуют «sky», вы могли бы поступить таким образом:

 from elasticsearch import Elasticsearch

es = Elasticsearch()

index = "abc"
my_doc_type ="your_doc_type"
ids = []

result = es.search(index="abc", doc_type= my_doc_type body={"query": {"term": {"my_field":  "sky"}}})     

for res in in result['hits']['hits']:
    ids.append(res['ids'])




for doc in es.mtermvectors(index=index,doc_type=doc_type,body=dict(ids=ids,parameters=dict(term_statistics=True,field_statistics=True,fields=fields)))['docs']:                                                                                                                                                            
    fields = doc['term_vectors']  
    terms = field['terms']  
    tf = vec["term_freq"]
    df =  vec["doc_freq"]
  

Комментарии:

1. Я не совсем понимаю. В итоге я отключил _source ( elastic.co/guide/en/elasticsearch/reference/current /… ) Однако я не совсем уверен, «удаляет» ли это данные? Также я не знаю, как отключить источник только в одном столбце, а не во всех из них.

2. Я не понимаю, почему вы должны отключить _source ? Таким образом, вы не сможете отлаживать свои запросы. Если вы хотите сэкономить место, вам следует отключить norms и поставить «index_options»: «freqs», но будьте внимательны 😉 Пожалуйста, прочтите здесь: elastic.co/guide/en/elasticsearch/reference/current /…

3. Приведет ли отключение источника к удалению данных из кластера? Данные не могут храниться в облаке, мне также не нужно просматривать данные, а только выполнять поиск по ним, чтобы я мог найти URL-адреса, связанные с текстами. т. Е. я хочу искать академические статьи на основе их содержания, но мне никогда не нужно извлекать полный текст документов.