descargar - motor solr
Lucene/Solr: informaciĆ³n de compensaciĆ³n de la tienda para ciertas palabras clave (2)
Estamos utilizando Solr para almacenar documentos con palabras clave; cada palabra clave está asociada a un lapso dentro del documento.
Las palabras clave fueron producidas por algunos análisis sofisticados y / o manual antes de cargarlos en Solr. Una palabra clave se puede repetir varias veces en un documento. Por otro lado, diferentes instancias de la misma cadena en un único documento pueden conectarse con diferentes palabras clave.
Por ejemplo, este documento
Bill studied The Bill of Rights last summer.
podría ir acompañado de las siguientes palabras clave (con desplazamientos entre paréntesis):
William Brown (0:4)
legal term (13:31)
summer 2011 (32:43)
(Obviamente en otros documentos, Bill podría referirse a Bill Clinton o Bill Gates . De manera similar, el verano pasado se referirá a años diferentes en documentos diferentes. Tenemos toda esta información para todos los documentos).
Sé que el documento puede tener un campo, por ejemplo KEYWORD , que almacenará a William Brown
. Luego, cuando busque a William Brown
, obtendré el documento anterior. Esa parte es fácil.
Pero no tengo idea de cómo almacenar la información que corresponde a William Brown
en el lapso de texto 0:4
así que puedo destacar el primer Bill
, pero no el segundo.
Pensé que podría usar TermVectors , pero no estoy seguro si / cómo puedo almacenar compensaciones personalizadas. Creo que este es un escenario bastante común ...
EDITAR: editado para dejar en claro que Bill puede referirse a diferentes personas / cosas en diferentes documentos.
EDIT2: editado para dejar en claro que un documento puede contener homónimos (cadenas idénticas con diferentes significados).
Por defecto, Solr almacena la posición inicial / final de cada token una vez que se ha tokenizado, por ejemplo, utilizando el StandardTokenizer. Esta información está codificada en el índice de subrayado. El caso de uso que describió aquí se parece mucho al SynonymFilterFactory
.
Cuando define un sinónimo utilizando la función SynonymFilterFactory
por ejemplo, que: foo => baz
foo es equivalente a la barra, el término de la barra se agrega a la secuencia de token generada cuando el texto se tokeniza, y tendrá la misma información de compensación que la original simbólico. Entonces, por ejemplo, si su texto es: "foo es impresionante", el término foo tendrá la siguiente información de compensación bar(start=0,end=3)
se agregará una nueva bar(start=0,end=3)
token bar(start=0,end=3)
a su índice (suponiendo que está utilizando el SynonymFilterFactory
en el momento del índice):
text: foo is awesome
start: 0 4 7
end: 3 6 13
Una vez que se aplica SynonymFilterFactory
:
bar
text: foo is awesome
start: 0 4 7
end: 3 6 13
Por lo tanto, si activa una consulta utilizando foo
, el documento coincidirá, pero si usa la bar
como su consulta, el documento también coincidirá, ya bar
ficha de bar
se agrega mediante la función de SynonymFilterFactory
En su caso particular, está tratando de lograr sinónimos de varios términos, que es un tipo de problema difícil, es posible que necesite algo más que el filtro de sinónimos predeterminado de Solr. Consulta esta publicación de los chicos de OpenSourceConnections y esta otra publicación de Lucidworks (la compañía detrás de Solr / Lucene). Estas dos publicaciones deberían proporcionar información adicional y las advertencias de cada enfoque.
¿Necesita recuperar los desplazamientos almacenados para un procesamiento posterior?
Dos Q Monte
Pros de la solución:
- Anotaciones lógicamente almacenadas con documentos de origen
- No se requiere conocimiento de implementación de resaltado o desarrollo personalizado de resaltado de Java
- Como toda personalización ocurre fuera de Solr, esta solución debe ser compatible con futuras versiones de Solr.
Solución Contras:
- Requiere dos consultas para ser ejecutado
- Requiere código en su cliente de búsqueda para combinar los resultados de una consulta en la otra.
Con Solr 4.8+ puede anidar documentos secundarios (anotaciones) debajo de cada documento principal (texto) ...
curl http://localhost:8983/solr/update/json?softCommit=true -H ''Content-type:application/json'' -d ''
[
{
"id": "123",
"text" : "Bill studied The Bill of Rights last summer.",
"content_type": "source",
"_childDocuments_": [
{
"id": "123-1",
"content_type": "source_annotation",
"annotation": "William Brown",
"start_offset": 0,
"end_offset": 4
},
{
"id": "123-2",
"content_type": "source_annotation",
"annotation": "legal term",
"start_offset": 13,
"end_offset": 31
},
{
"id": "123-3",
"content_type": "source_annotation",
"annotation": "summer 2011",
"start_offset": 32,
"end_offset": 43
}
]
}
]
... usando bloque unirse para consultar las anotaciones.
1) Consulta de anotación : http://localhost:8983/solr/query?fl=id,start_offset,end_offset&q={!child of=content_type:source}annotation:"William Brown"
"response":{"numFound":1,"start":0,
"docs":[
{
"id": "123-1",
"content_type": "source_annotation",
"annotation": "William Brown",
"start_offset": 0,
"end_offset": 4
}
]
}
Almacene estos resultados en su código para que pueda doblar en las compensaciones de anotación después de que vuelva la siguiente consulta.
2) Source Query + Highlighting : http://localhost:8983/solr/query?hl=true&hl.fl=text&fq=content_type:source&q=text:"William Brown" OR id:123
(id: 123 descubierto en Annotation Query se convierte en ORed en la segunda consulta)
"response":{"numFound":1,"start":0,
"docs":[
{
"id": "123",
"content_type": "source",
"text": "Bill studied The Bill of Rights last summer."
}
],
"highlighting":{}
}
Nota: en este ejemplo, no se devuelve información destacada porque los términos de búsqueda no coinciden con ningún content_type:source
documentos content_type:source
. Sin embargo, tenemos las anotaciones y compensaciones explícitas de la primera consulta.
Luego, su código de cliente necesita tomar los resultados content_type:source_annotation
de la primera consulta e insertar manualmente marcadores de resaltado en content_type:source
resultados de content_type:source
de la segunda consulta.
Más información sobre unirse al bloque en el blog de Yonik aquí .