Index PDF and Office file contents via Apache Tika

Solr 10 dropped the ExtractingRequestHandler, so a dedicated Tika
container on the Solr VPS (Caddy route /tika/*, own basic-auth
credential; Tika itself has no auth) extracts file text during
indexing: TikaDownloadContentIndexer listens on
BeforeDocumentIsProcessedForIndexingEvent, resolves the file through
the existing DownloadFileResolver and appends the text (mime
whitelist, 30 MB cap, 100k chars, fail-soft) to the document's content
field. Extractions are cached in var/tika-cache keyed on
path+size+mtime - a full re-index of 177 downloads drops from 2:12 min
to 27 s, replacing a file re-extracts naturally. Datasheet
specifications ("625i", "genlock") are now searchable. Spec v1.15.
This commit is contained in:
orasche committed 2026-09-11 13:15:05 +02:00
1 parent 5bb4e374b4
commit 8c881d153c
9 files changed
+499 -6

No files matched your search

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Product Finder - delivers the category hierarchy for the filter selects.
One element per products page, placed above the product lists.
-->
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<sheetTitle>Product Finder</sheetTitle>
<type>array</type>
<el>
<settings.categoryRoot>
<label>Category root</label>
<description>The category whose children become the filter's main categories. Leave empty to use the product category tree ("Product").</description>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<foreign_table>sys_category</foreign_table>
<foreign_table_where>AND sys_category.parent = 0 AND sys_category.sys_language_uid IN (-1,0) ORDER BY sys_category.title ASC</foreign_table_where>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Product category tree (default)</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
</items>
<default>0</default>
</config>
</settings.categoryRoot>
<settings.sorting>
<label>Sort categories by</label>
<description>Applies to the main categories and their subcategories alike.</description>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">Backend order (as arranged in the category tree)</numIndex>
<numIndex index="1">sorting</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">Alphabetically by title</numIndex>
<numIndex index="1">title</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">By uid</numIndex>
<numIndex index="1">uid</numIndex>
</numIndex>
</items>
<default>sorting</default>
</config>
</settings.sorting>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
@@ -67,6 +67,21 @@ tt_content {
}
}
# Product Finder - only the category hierarchy for the filter selects.
# Placed once above the product lists; the front end filters the products
# those lists already delivered, client side, via ?cat= and ?subcat=.
vitec_productfinder < lib.contentElementWithHeader
vitec_productfinder {
fields {
content {
fields {
productfinder = USER
productfinder.userFunc = Evomedien\Vitec\UserFunc\ProductFinderJsonRenderer->render
}
}
}
}
# EXT:solr search results as JSON - the search endpoint for the React frontend
solr_pi_results < lib.contentElementWithHeader
solr_pi_results {
@@ -389,7 +404,14 @@ plugin.tx_solr.index.queue {
products = 1
products {
# sys_category titles - feeds the category facet
fields.category_stringM = SOLR_RELATION
fields.category_stringM {
localField = categories
multiValue = 1
}
type = tx_vitec_domain_model_product
additionalWhereClause = hideonwebsite = 0
fields {
title = title
content = SOLR_CONTENT
@@ -466,7 +488,15 @@ plugin.tx_solr.index.queue {
usecases = 1
usecases {
# market titles from the MM relation - feeds the market facet
fields.market_stringM = SOLR_RELATION
fields.market_stringM {
localField = markets
multiValue = 1
}
type = tx_vitec_domain_model_usecase
# no_index is the editorial opt-out per story (concept 2026-08-20)
additionalWhereClause = hideonwebsite = 0 AND no_index = 0
fields {
title = title
content = SOLR_CONTENT
@@ -495,6 +525,39 @@ plugin.tx_solr.index.queue {
}
}
# Solutions became indexable on 2026-09-11: the sitemap alignment gave all
# 39 records a detail_page (and slug). Same pattern as markets.
solutions = 1
solutions {
type = tx_vitec_domain_model_solution
additionalWhereClause = detail_page > 0
fields {
title = title
content = SOLR_CONTENT
content {
cObject = COA
cObject {
10 = TEXT
10.field = subtitle
10.noTrimWrap = || |
20 = TEXT
20.field = teaser
20.noTrimWrap = || |
30 = TEXT
30.field = description
30.noTrimWrap = || |
}
}
url = TEXT
url {
typolink {
parameter.field = detail_page
returnLast = url
}
}
}
}
news = 1
news {
type = tx_news_domain_model_news
@@ -580,6 +643,16 @@ plugin.tx_solr.search.faceting {
field = type
keepAllOptionsOnSelection = 1
}
market {
label = Market
field = market_stringM
keepAllOptionsOnSelection = 1
}
category {
label = Category
field = category_stringM
keepAllOptionsOnSelection = 1
}
}
}
@@ -25,6 +25,7 @@ use TYPO3\CMS\Extbase\Utility\ExtensionUtility;
};
$registerPluginWithFlexForm('Productlist', 'Show Products by Category', 'FILE:EXT:vitec/Configuration/FlexForms/Productlist.xml', 'vitec-plugin-productlist');
$registerPluginWithFlexForm('Productfinder', 'Product Finder (filter data)', 'FILE:EXT:vitec/Configuration/FlexForms/Productfinder.xml', 'vitec-plugin-productlist');
$registerPluginWithFlexForm('Simplecard', 'Simple Card', 'FILE:EXT:vitec/Configuration/FlexForms/Simplecard.xml', 'vitec-plugin-simplecard');
$registerPluginWithFlexForm('Productshow', 'Show Single Product', 'FILE:EXT:vitec/Configuration/FlexForms/Productshow.xml', 'vitec-plugin-productshow');
$registerPluginWithFlexForm('Usecaseshow', 'Single Success Story', 'FILE:EXT:vitec/Configuration/FlexForms/Usecase.xml', 'vitec-plugin-usecaseshow');
@@ -16,6 +16,14 @@ mod {
CType = vitec_productlist
}
}
productfinder {
iconIdentifier = vitec-plugin-productlist
title = Product Finder (filter data)
description = Delivers the product category hierarchy for the filter selects. Place once above the product lists - it renders no products itself.
tt_content_defValues {
CType = vitec_productfinder
}
}
productshow {
iconIdentifier = vitec-plugin-productshow
title = Show single VITEC Product