Descripcion general
El conector JSON proporciona la funcionalidad para obtener datos de archivos JSON o APIs JSON y registrarlos en el indice de Fess.
Esta funcionalidad requiere el plugin fess-ds-json.
Requisitos previos
Es necesario instalar el plugin
Se requiere acceso a archivos JSON o APIs
Es necesario comprender la estructura del JSON
Instalacion del plugin
Metodo 1: Colocar el archivo JAR directamente
# Descargar desde Maven Central
wget https://repo1.maven.org/maven2/org/codelibs/fess/fess-ds-json/X.X.X/fess-ds-json-X.X.X.jar
# Colocar
cp fess-ds-json-X.X.X.jar $FESS_HOME/app/WEB-INF/lib/
# o
cp fess-ds-json-X.X.X.jar /usr/share/fess/app/WEB-INF/lib/
Metodo 2: Instalar desde la pantalla de administracion
Abrir «Sistema» -> «Plugins»
Subir el archivo JAR
Reiniciar Fess
Configuracion
Configure desde la pantalla de administracion en «Crawler» -> «Data Store» -> «Crear nuevo».
Configuracion basica
| Campo | Ejemplo |
|---|---|
| Nombre | Products JSON |
| Handler | JsonDataStore |
| Habilitado | Activado |
Configuracion de parametros
Archivo local:
file_path=/path/to/data.json
encoding=UTF-8
json_path=$
Archivo HTTP:
file_path=https://api.example.com/products.json
encoding=UTF-8
json_path=$.data
API REST (con autenticacion):
file_path=https://api.example.com/v1/items
encoding=UTF-8
json_path=$.items
http_method=GET
auth_type=bearer
auth_token=your_api_token_here
Multiples archivos:
file_path=/path/to/data1.json,https://api.example.com/data2.json
encoding=UTF-8
json_path=$
Lista de parametros
| Parametro | Requerido | Descripcion |
|---|---|---|
file_path | Si | Ruta del archivo JSON o URL de API (multiples separados por comas) |
encoding | No | Codificacion de caracteres (predeterminado: UTF-8) |
json_path | No | Ruta de extraccion JSONPath (predeterminado: $) |
http_method | No | Metodo HTTP (GET, POST, etc., predeterminado: GET) |
auth_type | No | Tipo de autenticacion (bearer, basic) |
auth_token | No | Token de autenticacion (para autenticacion bearer) |
auth_username | No | Nombre de usuario (para autenticacion basic) |
auth_password | No | Contrasena (para autenticacion basic) |
http_headers | No | Headers HTTP personalizados (formato JSON) |
Configuracion de scripts
Objeto JSON simple:
url="https://example.com/product/" + data.id
title=data.name
content=data.description
price=data.price
category=data.category
Objeto JSON anidado:
url="https://example.com/product/" + data.id
title=data.product.name
content=data.product.description
price=data.product.pricing.amount
author=data.product.author.name
Procesamiento de elementos de array:
url="https://example.com/article/" + data.id
title=data.title
content=data.body
tags=data.tags.join(", ")
categories=data.categories[0].name
Campos disponibles
data.<nombre_campo>- Campo del objeto JSONdata.<padre>.<hijo>- Objeto anidadodata.<array>[<indice>]- Elemento de arraydata.<array>.<metodo>- Metodos de array (join, length, etc.)
Detalles del formato JSON
Array simple
[
{
"id": 1,
"name": "Product A",
"description": "Description A",
"price": 1000
},
{
"id": 2,
"name": "Product B",
"description": "Description B",
"price": 2000
}
]
Parametros:
json_path=$
Estructura anidada
{
"data": {
"products": [
{
"id": 1,
"name": "Product A",
"details": {
"description": "Description A",
"price": 1000,
"category": {
"id": 10,
"name": "Electronics"
}
}
}
]
}
}
Parametros:
json_path=$.data.products
Script:
url="https://example.com/product/" + data.id
title=data.name
content=data.details.description
price=data.details.price
category=data.details.category.name
Array complejo
{
"articles": [
{
"id": 1,
"title": "Article 1",
"content": "Content 1",
"tags": ["tag1", "tag2", "tag3"],
"author": {
"name": "John Doe",
"email": "john@example.com"
}
}
]
}
Parametros:
json_path=$.articles
Script:
url="https://example.com/article/" + data.id
title=data.title
content=data.content
author=data.author.name
tags=data.tags.join(", ")
Uso de JSONPath
Que es JSONPath
JSONPath es un lenguaje de consulta para especificar elementos dentro de JSON. Es equivalente a XPath para XML.
Sintaxis basica
| Sintaxis | Descripcion |
|---|---|
$ | Elemento raiz |
$.field | Campo de nivel superior |
$.parent.child | Campo anidado |
$.array[0] | Primer elemento del array |
$.array[*] | Todos los elementos del array |
$..field | Busqueda recursiva |
Ejemplos de JSONPath
Todos los elementos (raiz):
json_path=$
Array especifico:
json_path=$.data.items
Array anidado:
json_path=$.response.results.products
Busqueda recursiva:
json_path=$..products
Ejemplos de uso
API de catalogo de productos
Respuesta de API:
{
"status": "success",
"data": {
"products": [
{
"product_id": "P001",
"name": "Laptop",
"description": "Laptop de alto rendimiento",
"price": 120000,
"category": "Computadoras",
"in_stock": true
}
]
}
}
Parametros:
file_path=https://api.example.com/products
encoding=UTF-8
json_path=$.data.products
Script:
url="https://shop.example.com/product/" + data.product_id
title=data.name
content=data.description + " Precio: " + data.price
digest=data.category
price=data.price
API de articulos de blog
Respuesta de API:
{
"posts": [
{
"id": 1,
"title": "Titulo del articulo",
"body": "Cuerpo del articulo...",
"author": {
"name": "Juan Garcia",
"email": "juan@example.com"
},
"tags": ["tecnologia", "programacion"],
"published_at": "2024-01-15T10:00:00Z"
}
]
}
Parametros:
file_path=https://blog.example.com/api/posts
encoding=UTF-8
json_path=$.posts
Script:
url="https://blog.example.com/post/" + data.id
title=data.title
content=data.body
author=data.author.name
tags=data.tags.join(", ")
created=data.published_at
API con autenticacion Bearer
Parametros:
file_path=https://api.example.com/v1/items
encoding=UTF-8
json_path=$.items
http_method=GET
auth_type=bearer
auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Script:
url="https://example.com/item/" + data.id
title=data.title
content=data.description
API con autenticacion Basic
Parametros:
file_path=https://api.example.com/data
encoding=UTF-8
json_path=$.data
http_method=GET
auth_type=basic
auth_username=apiuser
auth_password=password123
Script:
url="https://example.com/data/" + data.id
title=data.name
content=data.content
Uso de headers personalizados
Parametros:
file_path=https://api.example.com/items
encoding=UTF-8
json_path=$.items
http_method=GET
http_headers={"X-API-Key":"your-api-key","Accept":"application/json"}
Script:
url="https://example.com/item/" + data.id
title=data.title
content=data.content
Integracion de multiples archivos JSON
Parametros:
file_path=/var/data/data1.json,/var/data/data2.json,https://api.example.com/data3.json
encoding=UTF-8
json_path=$.items
Script:
url="https://example.com/item/" + data.id
title=data.title
content=data.content
Solicitud POST
Parametros:
file_path=https://api.example.com/search
encoding=UTF-8
json_path=$.results
http_method=POST
http_headers={"Content-Type":"application/json"}
post_body={"query":"search term","limit":100}
Script:
url="https://example.com/result/" + data.id
title=data.title
content=data.content
Solucion de problemas
Archivo no encontrado
Sintoma: FileNotFoundException o 404 Not Found
Verificaciones:
Verificar que la ruta del archivo o URL sea correcta
Confirmar que el archivo existe
Para URLs, confirmar que la API este funcionando
Verificar la conexion de red
Error de parseo JSON
Sintoma: JsonParseException o Unexpected character
Verificaciones:
Verificar que el archivo JSON tenga formato correcto:
# Validar JSON cat data.json | jq .
Verificar que la codificacion de caracteres sea correcta
Verificar que no haya caracteres o saltos de linea invalidos
Verificar que no contenga comentarios (JSON estandar no permite comentarios)
Error de JSONPath
Sintoma: No se obtienen datos o resultado vacio
Verificaciones:
Verificar que la sintaxis JSONPath sea correcta
Confirmar que el elemento objetivo existe
Validar JSONPath con herramientas de prueba:
# Verificar usando jq cat data.json | jq '$.data.products'
Verificar que la ruta apunte a la jerarquia correcta
Error de autenticacion
Sintoma: 401 Unauthorized o 403 Forbidden
Verificaciones:
Verificar que el tipo de autenticacion sea correcto (bearer, basic)
Verificar que el token o nombre de usuario/contrasena sean correctos
Verificar la fecha de expiracion del token
Verificar la configuracion de permisos de la API
No se obtienen datos
Sintoma: El crawl tiene exito pero el conteo es 0
Verificaciones:
Verificar que JSONPath apunte al elemento correcto
Verificar la estructura JSON
Verificar que la configuracion del script sea correcta
Verificar que los nombres de campo sean correctos (incluyendo mayusculas/minusculas)
Revisar los mensajes de error en el log
Procesamiento de arrays
Cuando JSON es un array:
[
{"id": 1, "name": "Item 1"},
{"id": 2, "name": "Item 2"}
]
Parametros:
json_path=$
Cuando JSON es un objeto que contiene un array:
{
"items": [
{"id": 1, "name": "Item 1"},
{"id": 2, "name": "Item 2"}
]
}
Parametros:
json_path=$.items
Archivo JSON grande
Sintoma: Memoria insuficiente o timeout
Solucion:
Dividir el archivo JSON en varios
Extraer solo las partes necesarias con JSONPath
Para APIs, usar paginacion
Aumentar el tamano del heap de Fess
Limite de tasa de API
Sintoma: 429 Too Many Requests
Solucion:
Aumentar el intervalo de crawl
Verificar el limite de tasa de la API
Usar multiples API keys para balancear la carga
Ejemplos avanzados de scripts
Procesamiento condicional
if (data.status == "published" && data.price > 1000) {
url="https://example.com/product/" + data.id
title=data.name
content=data.description
price=data.price
}
Concatenacion de arrays
url="https://example.com/article/" + data.id
title=data.title
content=data.content
tags=data.tags ? data.tags.join(", ") : ""
categories=data.categories.map(function(c) { return c.name; }).join(", ")
Configuracion de valores predeterminados
url="https://example.com/item/" + data.id
title=data.title || "Sin titulo"
content=data.description || data.summary || "Sin descripcion"
price=data.price || 0
Formato de fecha
url="https://example.com/post/" + data.id
title=data.title
content=data.body
created=data.created_at
last_modified=data.updated_at
Procesamiento de numeros
url="https://example.com/product/" + data.id
title=data.name
content=data.description
price=parseFloat(data.price)
stock=parseInt(data.stock_quantity)
Informacion de referencia
Descripcion General de los Conectores de Almacen de Datos - Descripcion general de conectores de Data Store
Conector CSV - Conector CSV
Conector de Base de Datos - Conector de base de datos
Rastreo de Almacén de Datos - Guia de configuracion de Data Store