o
    ›¨ÊhŒ5  ã                   @   sò   d dl Z d dlZd dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZmZ z#d dlZdej  krAd	k sDe‚ e‚d d
lmZmZ e de¡ W n ey^   edƒ‚w G dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    N)Úsettings)Ú
BaseEngine)ÚElasticsearchSearchBackendÚElasticsearchSearchQuery)Ú	DJANGO_CT)ÚMissingDependency)Úget_identifierÚget_model_ct)é   r   r   )é   r   r   )ÚbulkÚscanz<ElasticSearch 2.x support deprecated, will be removed in 4.0z³The 'elasticsearch2' backend requires the                             installation of 'elasticsearch>=2.0.0,<3.0.0'.                             Please refer to the documentation.c                       s€   e Zd Z‡ fdd„Zddd„Z																	d‡ fd
d„	Z						ddd„Z						d‡ fdd„	Z‡  ZS )ÚElasticsearch2SearchBackendc                    s   t ƒ j|fi |¤Ž d | _d S ©N)ÚsuperÚ__init__Úcontent_field_name)ÚselfÚconnection_aliasÚconnection_options©Ú	__class__© úZ/var/www/html/env/lib/python3.10/site-packages/haystack/backends/elasticsearch2_backend.pyr   #   s   
z$Elasticsearch2SearchBackend.__init__NTc              	   C   s8  |durt |ttfƒsJ ‚zh|du r(| jjj| jdd� d| _i | _d| _	W dS g }|D ]}| 
dtt|ƒf ¡ q,dddd |¡iii}t| jf|| jd	œ|  ¡ ¤Ž}d
d„ |D ƒ}t| jf|| jdœ|  ¡ ¤Ž | jjj| jd� W dS  tjy›   | js�‚ |dur’| j dd |¡¡ Y dS | j d¡ Y dS w )z´
        Clears the backend of all documents/objects for a collection of models.

        :param models: List or tuple of models to clear.
        :param commit: Not used.
        Ni”  )ÚindexÚignoreFz%s:%sÚqueryÚquery_stringz OR )r   r   c                 s   s   � | ]
}d |d dœV  qdS )ÚdeleteÚ_id)Ú_op_typer   Nr   )Ú.0Údocr   r   r   Ú	<genexpr>G   s   € 
ÿz4Elasticsearch2SearchBackend.clear.<locals>.<genexpr>)Úactionsr   )r   z2Failed to clear Elasticsearch index of models '%s'ú,z#Failed to clear Elasticsearch index)Ú
isinstanceÚlistÚtupleÚconnÚindicesr   Ú
index_nameÚsetup_completeÚexisting_mappingr   Úappendr   r	   Újoinr   Ú_get_doc_type_optionr   ÚrefreshÚelasticsearchÚTransportErrorÚsilently_failÚlogÚ	exception)r   ÚmodelsÚcommitÚmodels_to_deleteÚmodelr   Ú	generatorr$   r   r   r   Úclear'   sV   ÿÿýüÿÿýü
þöz!Elasticsearch2SearchBackend.clearr   Ú Fc                    s¶  t ƒ j|||||||||||||d�}g }|d ur||d< |d ur'|| |d< |
d u r.tƒ }
|d ury| di ¡ | ¡ D ]<\}}ddid|idœ}d	|v rV| d	¡|d
 d	< | dd¡r`d|d< d|v rk| d¡|d< |d  |¡ ||d |< q<|d urÑ| di ¡ | ¡ D ]I\}}| d¡ ¡ }| dd¡dkrª|dvrªd|d |d d… f }ddi||dœ|d||  	| d¡¡|  	| d¡¡dœgdœiidœ|d |< q‡|	d urñ| di ¡ |	D ]\}}ddidd|iidœ|d |< qÝ|
D ]}| 
dd|ii¡ qó|�rYd d| d¡ii|d< |d d  }d!|v �r8d"|d!  ¡ v �r.|d d  d! d" d# }n|d d  d! g}n|}t|ƒdk�rM|d$ |d d  d!< |S d"d#|ii|d d  d!< |S )%N)Úspelling_queryÚwithinÚdwithinÚdistance_pointr7   Úlimit_to_registered_modelsÚresult_classÚfromÚsizeÚaggsÚ_typeÚtermsÚfield)ÚmetarH   ÚorderrJ   Úglobal_scopeFTÚglobalÚfacet_filterÚgap_byÚ
gap_amounté   )ÚmonthÚyearz%s%sÚdate_histogram)rI   ÚintervalÚ
date_rangeÚ
start_dateÚend_date)rD   Úto)rI   Úranges)rJ   rT   rF   r   r   )rJ   ÚfilterÚfilteredr[   ÚboolÚmustr   )r   Úbuild_search_kwargsÚsetÚ
setdefaultÚitemsÚpopÚupdateÚgetÚlowerÚ_from_pythonr.   ÚkeysÚlen)r   r   Úsort_byÚstart_offsetÚ
end_offsetÚfieldsÚ	highlightÚfacetsÚdate_facetsÚquery_facetsÚnarrow_queriesr>   r?   r@   rA   r7   rB   rC   ÚkwargsÚfiltersÚfacet_fieldnameÚextra_optionsÚfacet_optionsÚvaluerU   Úqr\   Úanother_filtersr   r   r   r_   ^   s¢   óþÿüÿþÿÿý
þ
ÿýÿz/Elasticsearch2SearchBackend.build_search_kwargsc                 K   s®  ddl m}	 | js|  ¡  |jj}
|	| j  ¡  |
¡}| 	¡ }i }|d ur)||d< |d ur3|| |d< t
|ƒ}z�dd|gd|igdœii}g }|rZ|d	krZdd
d|iii}| |¡ |d u rdttddƒ}|rtt|ƒrttdd„ |D ƒƒ}n	|r{|  ¡ }ng }t|ƒdkrŽdt|ii}| |¡ t|ƒdkr¥dd|d ddt|ƒiidœii}| jjd|| jddœ|  ¡ ¤|¤Ž}W n tjyÏ   | jsÄ‚ | j d|¡ i }Y nw | j||d�S )Nr   )ÚconnectionsÚfrom_rE   r   Úmore_like_thisr   )rm   Úlikez*:*r   Ú#HAYSTACK_LIMIT_TO_REGISTERED_MODELSTc                 s   s   � | ]}t |ƒV  qd S r   )r	   )r!   r:   r   r   r   r#   #  s   € z=Elasticsearch2SearchBackend.more_like_this.<locals>.<genexpr>rH   r\   r]   r^   )r   r[   )Úbodyr   Ú_sourcezCFailed to fetch More Like This from Elasticsearch for document '%s')rC   r   )Úhaystackr{   r,   ÚsetupÚ_metaÚconcrete_modelr   Úget_unified_indexÚ	get_indexÚget_content_fieldr   r.   Úgetattrr   ri   ÚsortedÚbuild_models_listr   r'   r)   Úsearchr+   r0   r2   r3   r4   r5   r6   Ú_process_results)r   Úmodel_instanceÚadditional_query_stringrk   rl   r7   rB   rC   rs   r{   Úmodel_klassr   Ú
field_nameÚparamsÚdoc_idÚ	mlt_queryrr   Úadditional_filterÚmodel_choicesÚmodel_filterÚraw_resultsr   r   r   r}   å   s†   ýþÿÿ	ÿ
ÿ

þÿÿ	ýü
ûþø
z*Elasticsearch2SearchBackend.more_like_thisc                    sú   t ƒ  |||||¡}i }d|v rwi i i dœ}|d  ¡ D ]Z\}}	|	d d }
|
dkrXdd„ |	d D ƒ|d	 |< d
|	d v rW|	d d
 dkrWt|d	 | dd„ d�}||d	 |< q|
dkrjdd„ |	d D ƒ|d |< q|
dkrv|	d |d |< q||d< |S )NÚaggregations)rm   ÚdatesÚqueriesrJ   rG   rH   c                 S   s   g | ]
}|d  |d f‘qS )ÚkeyÚ	doc_countr   ©r!   Ú
individualr   r   r   Ú
<listcomp>^  s    ÿÿz@Elasticsearch2SearchBackend._process_results.<locals>.<listcomp>Úbucketsrm   rK   Úreverse_countc                 S   s   | d S )NrQ   r   )Úxr   r   r   Ú<lambda>e  s    z>Elasticsearch2SearchBackend._process_results.<locals>.<lambda>)rœ   rT   c                 S   s(   g | ]}t j  |d  d ¡|d f‘qS )rœ   iè  r�   )ÚdatetimeÚutcfromtimestamprž   r   r   r   r    k  s    û
ÿüÿrš   r   r�   r›   ro   )r   r�   rb   rŠ   )r   r˜   rn   rC   rA   Úgeo_sortÚresultsro   ru   Ú
facet_infoÚ
facet_typeÚsrtr   r   r   r�   L  s8   
ÿþÿ€ù	€z,Elasticsearch2SearchBackend._process_results)NT)Nr   Nr=   FNNNNNNNNNNN)Nr   NNNN)FNNF)	Ú__name__Ú
__module__Ú__qualname__r   r<   r_   r}   r�   Ú__classcell__r   r   r   r   r   "   sB    
:î 
øjúr   c                   @   s   e Zd ZdS )ÚElasticsearch2SearchQueryN)r¬   r­   r®   r   r   r   r   r°   z  s    r°   c                   @   s   e Zd ZeZeZdS )ÚElasticsearch2SearchEngineN)r¬   r­   r®   r   Úbackendr°   r   r   r   r   r   r±   ~  s    r±   )r¥   ÚwarningsÚdjango.confr   Úhaystack.backendsr   Ú'haystack.backends.elasticsearch_backendr   r   Úhaystack.constantsr   Úhaystack.exceptionsr   Úhaystack.utilsr   r	   r2   Ú__version__ÚImportErrorÚelasticsearch.helpersr   r   ÚwarnÚDeprecationWarningr   r°   r±   r   r   r   r   Ú<module>   s:    ÿþÿÿ  Z