tutorial index elastic json rest elasticsearch

json - index - elasticsearch search api



Elasticsearch API "Más como este" frente a más_me gusta_esta consulta (2)

En primer lugar, una pequeña introducción sobre la funcionalidad más parecida a esta y cómo funciona. La idea es que usted tenga un documento específico y desee tener otros similares.

Para lograr esto, necesitamos extraer algo de contenido del documento actual y utilizarlo para realizar una consulta para obtener otros similares. Podemos extraer contenido de los campos almacenados de lucene (o el campo de fuente de búsqueda de elastics, que en realidad es un campo almacenado en lucene) y, de alguna manera, volver a analizarlo o usar la información almacenada en los vectores de términos (si está habilitado durante la indexación) para obtener una lista de términos que podemos usar para consultar, sin tener que volver a analizar el texto. No estoy seguro de si elasticsearch intenta este último enfoque si hay vectores de términos disponibles.

Más como esta consulta le permite proporcionar un texto, independientemente de dónde lo obtuvo. Ese texto se utilizará para consultar los campos que seleccione y recuperar documentos similares. El texto no se utilizará en su totalidad, sino que se volverá a analizar, y solo se max_query_terms un máximo de max_query_terms (valor predeterminado 25), fuera de los términos que tienen al menos el min_term_freq (frecuencia de término mínimo, valor predeterminado 2) y la frecuencia del documento entre min_doc_freq y max_doc_freq . También hay más parámetros que pueden influir en la consulta generada.

Más como esta api va un paso más allá, lo que permite proporcionar la identificación de un documento y, nuevamente, una lista de campos. El contenido de esos campos se extraerá de ese documento específico y se usará para hacer una consulta más parecida a esta en los mismos campos. Eso significa que la consulta más parecida a esta consulta tendrá el texto de propiedad que contiene el texto extraído previamente y se realizará en los mismos campos. Como puede ver, más como esta api se ejecuta más como esta consulta bajo el capó.

Digamos que una consulta más como esta le brinda más flexibilidad, ya que puede combinarla con otras consultas y puede obtener el texto de la fuente que desee. Por otro lado, más como esta api expone la funcionalidad común haciendo un poco más de trabajo para usted pero con algunas restricciones.

En su caso, combinaría un par de consultas más, como esta, para que pueda hacer uso de la poderosa consulta DSL de elastics, aumentar las consultas de manera diferente y así sucesivamente. El inconveniente es que debe proporcionar el texto usted mismo, ya que no puede proporcionar la ID del documento para extraerlo.

Hay diferentes maneras de lograr lo que quieres. Yo usaría una consulta bool para combinar las dos consultas más como esta en una cláusula debería y darles un peso diferente. También usaría la consulta de más como este campo en su lugar, ya que desea consultar un solo campo a la vez.

{ "bool" : { "must" : { {"match_all" : { }} }, "should" : [ { "more_like_this_field" : { "tags" : { "like_text" : "here go the tags extracted from the current document!", "boost" : 2.0 } } }, { "more_like_this_field" : { "content" : { "like_text" : "here goes the content extracted from the current document!" } } } ], "minimum_number_should_match" : 1 } }

De esta manera, al menos una de las cláusulas debería coincidir, y una coincidencia en las etiquetas es más importante que una coincidencia en el contenido.

Elasticsearch tiene dos características similares para obtener documentos "similares":

Hay el "más como este API" . Me da documentos similares a uno dado. Aunque no puedo usarlo en expresiones más complejas.

También está la consulta "more_like_this" para usar en la API de búsqueda. Puedo usarla en bool o para aumentar las expresiones, pero no puedo asignarle el ID de un documento. Tengo que proporcionar el parámetro "like_text" .

Tengo documentos con etiquetas y contenido. Algunos documentos tendrán buenas etiquetas y otros no tendrán ninguna. Quiero una función de "Documentos similares" que funcionará cada vez, pero clasificaré los documentos con etiquetas coincidentes más alto que los documentos con texto correspondiente. Mi idea fue:

{ "boosting" : { "positive" : { "more_like_this" : { "fields" : ["tag"], "id" : "23452", "min_term_freq" : 1 } }, "negative" : { "more_like_this" : { "fields" : ["tag"], "id" : "23452", } }, "negative_boost" : 0.2 } }

Obviamente, esto no funciona porque no hay "id" en "more_like_this" . ¿Cuáles son las alternativas?