# Private Document Search and AI Answers Kit: Apache projects for small business October 30, 2026. Companion to [Private document search and AI answers with Apache](https://jwatte.com/blog/private-document-search-ai-answers-apache/). ## How to use this kit Start with the decision sheet, choose one path and name a person who can stop the pilot. Use approved sample documents before connecting a live collection. We recommend retrieval augmented generation, or RAG, before fine tuning: search retrieves current passages and a model drafts an answer from them. The instructions below are a planning and acceptance kit based on documentation, not an installation we performed or a production support contract. ## One page decision sheet Complete this sheet before ordering equipment. All thresholds you enter are your acceptance decisions, not published performance guarantees. | Decision | Fill in before starting | |---|---| | Problem | Staff need to find ______ to complete ______. | | First collection | Approved documents: ______. Excluded material: ______. | | Path | Low: approved Q&A. Medium: public or low sensitivity document search. High: different users have different document permissions. | | Business owner | ______ approves scope and usefulness. | | Technical owner and backup person | ______ maintains services; ______ covers absence. | | Content owner | ______ approves answers, revisions and retirement. | | Data and records owner | ______ approves retention, logging, deletion and legal holds. | | First test | 50 real questions with known answers, source passages and permitted roles. | | Deny test | Restricted document ______ must never appear to role ______ in text, titles, snippets, citations, suggestions or answers. | | Quality thresholds | Correct supported answers: ______. Maximum unsupported answers: ______. Acceptable response time: ______. | | Abstention | Record the “I do not know” rate separately for answerable and deliberately unanswerable questions. | | Recovery target | Maximum acceptable lost work: ______. Maximum outage: ______. | | Money and time | Setup ceiling: ______. Monthly ceiling: ______. Review date: ______. | | Stop conditions | Any permission leak; an unapproved external data transfer; no restore; no responsible operator; or failure to beat the existing search method within the agreed budget. | Keep CJIS material outside this pilot. For county or city records, have the records officer decide how state retention and public records request rules apply to source files, prompts, answers and logs. Check HIPAA before patient data, the GLBA Safeguards Rule before covered financial records, attorney client confidentiality before matter files, and FERPA before student records. Local hosting alone establishes none of these requirements. Include keyboard and screen reader checks for staff and public interfaces. ## The pieces and current release choices | Piece | Who owns it | Release used for planning | Job | |---|---|---|---| | [Apache Answer](https://answer.apache.org/download/) | Capable owner or helper | 2.0.3, October 9, 2026 | Curated questions and answers | | [Apache Tika](https://tika.apache.org/download.html) | Developer and operator | 4.2.0; supported 3.x release 3.3.3 | File type detection, text and metadata extraction | | [Apache Solr](https://solr.apache.org/downloads.html) | IT and developer | 10.0.0 current major; 9.11.0 previous major | Keyword and vector retrieval | | [Apache ManifoldCF](https://manifoldcf.apache.org/en_US/download.html) | IT and identity specialist | 2.31 | Repository collection and access tokens | | [Apache OpenNLP](https://opennlp.apache.org/download.html) | Developer | Stable 2.5.12; 3.0.0-M6 is a milestone | Sentence, language and entity analysis | | Local model runtime and gateway | IT and developer | Select reviewed, compatible releases | Generate answers from approved retrieved passages | Solr 10 requires Java 21. Tika 4.2.0 requires Java 17 or later; its ZIP must be unpacked with its supporting libraries. Tika 4.x is not distributed as a single runnable JAR. Tika 3.3.3 requires Java 11 or later. [OpenNLP 2.5.12 requires Java 17](https://raw.githubusercontent.com/apache/opennlp/opennlp-2.5.12/pom.xml); the 3.x branch requires JDK 21. [ManifoldCF 2.31 release changes](https://downloads.apache.org/manifoldcf/apache-manifoldcf-2.31/apache-manifoldcf-2.31.CHANGES.txt) identify its Java 25 upgrade; use JDK 25 for 2.31. Older Java 11 README guidance is stale. Keep separate compatible runtimes where needed. A common Java installation does not establish connector compatibility. ## Low path: Answer with approved explanations **Fit:** people repeatedly need an approved procedure, and an editor can maintain it. For example, a nine person HVAC company could keep equipment reset references; a two location coffee shop could keep opening and cleaning instructions. These are illustrations. Both fit the one small server budget below, with content writing budgeted separately. 1. Choose a maintained host and restrict administration. Our pilot allowance is 2 vCPU, 4 GiB RAM and 80 GiB disk, not an upstream minimum or capacity promise. Follow [Answer's installation guide](https://answer.apache.org/docs/installation/) and its Docker Compose route. Use a reviewed release image and persistent storage. 2. Choose the database before importing content. The [Answer FAQ](https://answer.apache.org/docs/faq/) recommends MySQL for actual use. Configure database credentials, uploads, HTTPS and any required registration mail. Our cost case assumes an existing suitable SMTP allowance. 3. Set site access and account policies, then test as an ordinary user and a disallowed user. Review the [plugin catalog](https://answer.apache.org/plugins/): it lists generic OAuth2 and Elasticsearch, MeiliSearch and Algolia search plugins. The checked list did not establish LDAP or SAML support. Do not promise a Solr plugin or directory integration without a demonstrated implementation. 4. Seed real questions with an approved answer, source, owner and next review date. Follow the [Answer documentation](https://answer.apache.org/docs/) for administration. Test a correction and retirement as well as a successful search. 5. Start with the browser. A Teams Website tab can provide a convenient bookmark, but [Microsoft's change announcement](https://devblogs.microsoft.com/microsoft365dev/upcoming-updates-to-loading-websites-in-teams-tabs/) says new Teams clients open Website tabs in a browser. Test your actual client, sign-in and redirect. An embedded custom Teams app is separate development. Back up MySQL, uploads and the configuration needed to rebuild. Restore them together into an isolated test installation. Read [Answer security](https://answer.apache.org/community/security/) before updates; older releases had reset-link reuse and external-image privacy issues. Pinning a release is useful only with an ongoing patch review. First week: the content owner approves the question set, the helper configures access and recovery, and ordinary staff try the questions during real work. Keep using the existing handbook if the pilot adds another place to search without improving answers. ## Medium path: searchable documents, then generated answers **Fit:** an approved collection is already public or low sensitivity. A twelve person manufacturer might begin with public equipment manuals. A six person property manager might begin with blank forms and public maintenance guides. Private tenant, employee and customer files stay outside this path unless their authorization model is explicitly built and tested. 1. Begin with text extraction. Follow [Tika downloads and runtime instructions](https://tika.apache.org/download.html); preserve source identifiers, titles, dates and extraction errors. Its [format list](https://tika.apache.org/3.2.3/formats.html) covers over a thousand file types. For scanned pages, follow the [Tesseract OCR integration](https://cwiki.apache.org/confluence/display/TIKA/TikaOCR). OCR adds processing and review work; sample tables, rotated pages and poor scans. 2. Run parsing in an isolated process with memory, time, file-size and network limits, following [Tika's security model](https://tika.apache.org/security-model.html). Check [Tika advisories](https://tika.apache.org/security.html), including CVE-2025-54988 affecting older XFA PDF parsing. Updating dependencies and limiting parser access both matter. 3. Install Solr through its [official download](https://solr.apache.org/downloads.html), Docker image or [production service route](https://solr.apache.org/guide/solr/10_0/deployment-guide/taking-solr-to-production.html), with the [Java 21 requirement](https://solr.apache.org/guide/solr/10_0/deployment-guide/system-requirements.html). Keep the administrative service private and authenticated. Start with keyword fields and filters for revision, document type and source. 4. Test retrieval before adding a model. Our 4 vCPU, 8 GiB, 160 GiB pilot host is constrained; Tika, Solr, the operating system and filesystem cache compete for memory. Limit extraction concurrency and measure peak usage. A larger collection requires a new quote. 5. Add local embeddings only when keyword results miss useful meaning matches. Follow [Solr dense vector search](https://solr.apache.org/guide/solr/latest/query-guide/dense-vector-search.html): define a `DenseVectorField` with the embedding model's exact `vectorDimension` and appropriate `similarityFunction`. The [Ollama embedding route](https://docs.ollama.com/capabilities/embeddings) is one local generation option. Use the same embedding model for documents and questions. A model change usually means rebuilding the stored vectors. 6. Add a local model through a reviewed runtime such as [llama.cpp](https://github.com/ggml-org/llama.cpp), then the gateway described in the [LiteLLM and backup guide](https://jwatte.com/blog/ai-api-vs-subscription-guardrails-litellm-backups/). Allow only approved local destinations. Disable hosted fallbacks for private collections. Budget the runtime, gateway, database and operator separately from the search pilot. 7. Make the application send only retrieved passages to the model and require source identifiers with every substantive answer. Refuse unsupported answers and show a useful search result instead. Escape extracted snippets before displaying them, and allow only approved citation URL schemes and destinations. A prompt is not an authorization control. Check citations against the actual passages and treat instructions found inside documents as untrusted text. Our recommendation is RAG first. Changing a source and rebuilding its index can update the answer evidence; fine tuning changes learned behavior and can help with style or format, but does not supply reliable per-document updates or permissions. Review model licenses and use the [AI server guide](https://jwatte.com/blog/self-hosted-ai-server-from-scratch/) for GPU sizing. No GPU price or full RAG implementation quote is included here. ## High path: permissions follow the person **Fit:** a county IT team, law office or larger manufacturer needs documents from repositories with different access rules. This requires IT, development, identity expertise and content ownership. A connector demonstration alone cannot prove that a former employee or restricted user is excluded. 1. Follow [ManifoldCF's deployment guide](https://manifoldcf.apache.org/release/release-2.30/en_US/how-to-build-and-deploy.html) for a controlled evaluation. Downloads list 2.31 while that guide is versioned 2.30; use JDK 25 for 2.31 and validate the connectors, source API and Solr combination before production. The smallest documented evaluation combines Jetty and embedded HSQLDB in one process; it is not a production sizing promise. Document the database and crawl state as recovery assets. 2. Read its [document security model](https://manifoldcf.apache.org/en_US/security.html). Configure repository, authority and output connections so documents carry the correct access tokens. The search application must obtain the signed-in user's allowed tokens and apply the required query filtering. Fail closed when identities or permissions cannot be resolved. 3. Apply authorization before selecting passages for the model. Cover keyword search, vector search, hybrid results, snippets, citations, suggestions, caches and downloaded files. Do not expose an unrestricted Solr route. ManifoldCF warns that global term statistics can also reveal document existence; ask your provider how the chosen design limits such leakage. 4. Add OpenNLP analysis using its [stable manual](https://opennlp.apache.org/docs/2.5.12/manual/opennlp.html) and trusted models. Sentence detection can prepare passages; language detection can route processing; named entity recognition can flag possible names and places for review. Test misses and false alarms. It is not a chatbot or a guaranteed personal-data scrubber. 5. Keep Answer for explanations approved by a content owner, with demonstrated audience controls or separate private sites. Do not assume native matter level access controls. Monitor each service, source freshness and authority failures. Ask for a priced operations and recovery plan before widening the collection. The series' 24 to 60 setup hours and 6 to 16 monthly oversight hours are only a starting platform allowance; connector development, records review and model hardware are additional. Read [ManifoldCF advisories](https://security.apache.org/projects/manifoldcf/), [Solr security news](https://solr.apache.org/security-news.html), [OpenNLP security](https://opennlp.apache.org/security.html) and [ASF security guidance](https://www.apache.org/security/). CVE-2022-45910 affected ManifoldCF Active Directory authority handling through 2.23. Solr's CVE-2026-22022 authorization bypass was fixed in 9.10.1; a separate JWT advisory includes 10.0.0 and requires explicitly setting `blockUnknown` to `true`. Read the full advisory for your version and authentication design. OpenNLP models, dictionaries and training data must be trusted like code. ## Acceptance record and first week plan The 50-question set is our suggested starting test size, not statistical proof of safety. Include exact phrases, paraphrases, changed procedures, conflicting revisions, poor scans and questions with no answer in the collection. Keep some questions aside while tuning. ```text Question ID: Question and business task: Test user role: Expected answer or expected refusal: Approved source and revision: Expected supporting passage: Returned passages and citations: Unsupported statements: Time to useful answer: Reviewer and decision: ``` Record supported correct answers divided by answerable questions, unsupported answers divided by all attempts, and abstentions divided by each question category. An increasing “I do not know” rate may mean safer refusal or broken retrieval. Inspect the actual failures before changing the threshold. Run the restricted-document test as two users. Then remove permission, disable a user and delete or supersede a document. Repeat after a crawl, during an authority outage and from a previously used session. Cached answers must not retain access that was revoked. A restricted title is a leak even when the body stays hidden. During the first week, agree scope and expected answers, configure the smallest pilot, run the question set, test denial and restoration, then make a recorded continue-or-stop decision. This is our suggested sequence, not a promise that every path takes a week. Continue only with an owner, funded maintenance and a measurable improvement over the current method. ## Operations record | Asset | Backup or rebuild requirement | Acceptance check | |---|---|---| | Source files and approved answers | Authoritative source copies and required history | Open the expected revision | | Answer | Database, uploads and configuration | Questions, accounts and attachments restore together | | Solr | Supported index backup, schema and configuration; reproducible ingestion | Counts, sample searches and deny tests agree | | Tika and OpenNLP | Runtime versions, trusted models, parser settings and extraction status | A known file produces expected text and flags | | ManifoldCF | Database, jobs, connection settings and protected credentials | Crawl resumes without silently dropping permissions | | Model and gateway | Approved weights, license, configuration, gateway database and protected recovery secrets | Local route works; forbidden destination fails | | Logs | Approved retention and access policy | Useful incident trail without unnecessary record copies | Assign an alert recipient for dead services, stale crawls, failed extraction, full disks, exhausted memory, failed backups and missing backup heartbeats. Restore a representative collection and rerun the question and denial tests after meaningful changes. Keep encrypted independent backups with a recoverable key. Deletion requests and legal holds must cover derived text, vectors, answers, caches and retained copies under the approved policy. ## Cost worksheet Prices below are US dollars before tax, using the October 29, 2026 series research. Hours, retained storage and workload counts are our assumptions. The [BLS wage](https://data.bls.gov/oesprofile/?areas=INDUSTRY,STATE,MSA&major_group=150000&measure=01&occupation=151244&year=2025) of $47.66 divided by the [0.700 compensation wage share](https://data.bls.gov/timeseries/CMU2020000000000P), rounded to cents, gives $68.09/hour. Outside providers bill more; get a quote. ```text Setup hours: ____ low / ____ high Monthly administration hours: ____ low / ____ high Servers and monthly charges: ____ Retained backup GB, including versions: ____ low / ____ high Backup = max(0, retained GB minus 10) x $0.00695 Setup = setup hours x $68.09 Monthly = hosting + backup + administration hours x $68.09 36 month total = setup + 36 x monthly Alternative total = alternative setup + 36 x alternative monthly Savings = alternative total minus self hosted total Break even = max(0, ceiling(setup difference / monthly savings)) when monthly savings > 0; otherwise never when self hosting starts and runs more expensively. ``` [DigitalOcean](https://www.digitalocean.com/pricing/droplets) supplies the $24 and $48 monthly caps. [B2](https://www.backblaze.com/cloud-storage/pricing) supplies $6.95 per decimal TB monthly and the first 10 GB free. Our 50 to 200 GB retained backups cost $0.278 to $1.3205 monthly. We assume transfer and requests remain within included allowances. | Cost | Answer low / high | Search pilot low / high | |---|---:|---:| | Hosts | One $24 / one $24 | One $48 / one $48 | | Setup hours | 4 / 12 | 4 / 12 | | Monthly admin hours | 1 / 3 | 1 / 3 | | Setup cost | $272 / $817 | $272 / $817 | | Monthly with administration | $92 / $230 | $116 / $254 | | 36 month total | $3,598 / $9,082 | $4,462 / $9,946 | | Managed reference, 36 months | $3,600 / $3,600 | $1,620 / $1,620 | | Self hosted savings | $2 / negative $5,482 | Negative $2,842 / negative $8,326 | | Break even month | 36 / never | Never / never | The low Answer calculation is `4 x $68.09 + 36 x ($24 + $0.278 + $68.09)`. [Discourse Pro](https://www.discourse.org/pricing) is $100 monthly, so `36 x $100 = $3,600`. It is a managed community alternative, not hosted Answer. [Algolia Grow](https://www.algolia.com/pricing/) includes 10,000 search requests and 100,000 records monthly; our fixed 100,000 searches and 50,000 records cost `(100,000 minus 10,000) / 1,000 x $0.50 = $45` monthly, or $1,620 over 36 months. These are bounded operations comparisons. Alternative incremental setup is zero by assumption. Both sides exclude content writing, custom interfaces, cleanup, migration, compliance assessment, training and major incidents. The medium comparison prices keyword search infrastructure only: OCR migration, embedding compute, model/GPU hardware, LiteLLM, its database and additional service administration require separate lines. It is not a complete RAG quote. Managed wins the medium cost comparison and the high Answer case; the low Answer saving is too small to survive an unexpected support task. ## Setup time when Claude or ChatGPT does the typing Use the same single-server assumptions only for the bounded pilots above. AI setup is 50% to 80% of manual hours: 2 to 9.6 hours, including 1 to 3 review hours. AI monthly administration is 75% to 100%: 0.75 to 3 hours, including 0.5 to 1.5 review hours. Prompting, testing and corrections count. These are planning assumptions, not measured Apache installation savings. | 36 month view | Answer low / high | Search pilot low / high | |---|---:|---:| | Manual | $3,598 / $9,082 | $4,462 / $9,946 | | Claude Pro subscription | $3,049 / $9,119 | $3,913 / $9,983 | | ChatGPT Plus subscription | $3,049 / $9,119 | $3,913 / $9,983 | | Claude Opus 5.5 API | $2,863 / $9,033 | $3,727 / $9,897 | | GPT-6 Astra API | $2,886 / $9,204 | $3,750 / $10,068 | Against Discourse, low Answer subscription assistance breaks even in month 8; either low API view breaks even in month 6. All high Answer cases and both medium search cases still fail to break even against their managed references. [Claude Pro](https://claude.com/pricing) and [ChatGPT Plus](https://chatgpt.com/pricing/) are each $20 monthly in the supplied research. Charge one separate setup month, then $5 allocated monthly for 36 operating months only when other work uses the other 75%. Sole use adds $540. Usage limits can require more time or spend. Matching prices do not imply matching allowances. Our cumulative API budgets are 200,000 to 1,000,000 setup input tokens and 20,000 to 100,000 output; monthly budgets are half those amounts. Low input is 30% ordinary, 10% short cache writes and 60% cache reads. High input is uncached. Budgets include retries and billed reasoning; cumulative tokens do not mean one enormous prompt. | Dollars per million tokens | Ordinary input | Short cache write | Cache read | Output | |---|---:|---:|---:|---:| | [Claude Opus 5.5](https://platform.claude.com/docs/en/about-claude/pricing) | $4 | $5 | $0.20 | $20 | | [GPT-6 Astra](https://developers.openai.com/api/docs/pricing) | $10 | $12.50 | $1 | $50 | API fee = `(ordinary input x rate + writes x rate + reads x rate + output x rate) / 1,000,000`. Input categories are exclusive. These standard synchronous rates yield Opus setup/monthly fees of $0.764/$0.382 low and $6/$3 high; Astra fees are $1.97/$0.985 low and $15/$7.50 high. No credits, batch discounts, paid tools or regional extras are assumed. AI total = AI setup hours x $68.09 + setup tool fee + 36 x (unchanged hosting and backup + AI admin hours x $68.09 + monthly tool fee). Round after calculating. High cases save no monthly labor. Subscription assistance becomes more expensive than manual operation in month 29; Astra API assistance does so in month 20. Opus retains a $49 advantage at month 36 but crosses in month 53 if assumptions continue. This does not make AI universally cheaper. Claude Code or [Codex CLI](https://developers.openai.com/codex/cli) can draft configuration and restore commands. [Desktop Commander](https://desktopcommander.app/) can work on an authorized server; our base assumes its free local service. Optional Remote Pro at $20 for setup plus a justified $5 monthly allocation adds $200. [Claude in Chrome](https://support.claude.com/en/articles/12012173-get-started-with-claude-in-chrome) can inspect provider and application pages while you watch; [ChatGPT's cloud browser](https://help.openai.com/en/articles/20001280-using-cloud-browser-in-chatgpt) uses a separate browser where available. Browser access does not supply server administration permissions. Use a new server, approve commands or restrict a sandbox, and keep secrets and private documents out of hosted chats. Use subscriptions for supervised supported tools and API keys for custom pipelines. Review changes, watch dashboard actions and test restoration. The local document assistant and a hosted assistant helping write its configuration are different data paths. ### Copyable setup brief ```text Prepare a private document search pilot in an isolated environment. Chosen path: [Low / Medium / High]. Business task and approved collection: [fill in]. Technical owner and content owner: [fill in]. Allowed model destinations: [fill in]. Excluded records and prohibited destinations: [fill in]. Budget and recovery targets: [fill in]. Read current official installation and security documentation first. Propose compatible versions, persistent storage, authentication, backup and restore steps. Identify missing information explicitly. Use synthetic examples until the owner approves the collection. Do not put secrets or document contents in chat or configuration history. Keep parser processes isolated and service administration private. Build keyword search before vectors and generated answers. Test the 50-question set, citations, refusal behavior, access revocation, restricted documents, deletion, service failure and restoration. Produce reviewable configuration and a cost worksheet before changes. Do not publish services or connect live repositories without the owner's approval of the specific access and data-handling design. ``` ## Sources and further reading The cards reuse official project documentation checked October 29 and 30, 2026. Additional release and advisory checks on October 30 were read around 00:27 to 00:37 UTC, including the ManifoldCF Java 25 release change. Microsoft Teams behavior was checked October 30 at 00:28 UTC. Versions and security advice must be checked again before installation. 1. [Search and knowledge tools](https://jwatte.com/blog/apache-search-knowledge-base-small-business/) and [OpenNLP background](https://jwatte.com/blog/apache-ai-machine-learning-small-business/#opennlp-analyze-text-locally-without-pretending-it-is-a-chatbot). October 29 research. 2. [Tika extraction guide](https://jwatte.com/blog/apache-tika-document-text-extraction-small-business/) and [ManifoldCF permission guide](https://jwatte.com/blog/apache-manifoldcf-permission-aware-search-small-business/). Companion guides dated October 30. 3. [Private server access](https://jwatte.com/blog/kimsufi-vps-cloudflare-tunnel-access/) and [Apache business stack](https://jwatte.com/blog/apache-stack-small-medium-business/). October 29 research. 4. Hosting, B2 and BLS links in the worksheet: October 29, 21:10 to 21:18 UTC. Discourse and Algolia prices were rechecked October 30 at 00:28 UTC and confirmed by supplied regular-browser observations from October 29 about 22:10 to 22:20 UTC. Check again before purchase. 5. Claude and OpenAI pricing and tool documentation in the AI section: October 29, 23:27 to 23:32 UTC; ChatGPT subscription pricing supplied from an ordinary browser observation. [Desktop Commander pricing](https://desktopcommander.app/pricing/) was read at 23:31 UTC. 6. [RAG research](https://arxiv.org/abs/2005.11401), [LoRA research](https://arxiv.org/abs/2106.09685) and [QLoRA research](https://arxiv.org/abs/2305.14314). Read October 30, 2026. Retrieval and tuning solve different parts of the application. 7. [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). Commercial use and modification are permitted under its conditions, including applicable redistribution notices. It provides no warranty and does not license unrelated model weights or grant trademark endorsement. *This kit is informational, not legal, security or IT consulting advice. Check the applicable records, privacy and accessibility obligations with the responsible people before using real sensitive data.* *Apache, the Apache feather logo and the Apache project names are trademarks of The Apache Software Foundation. This site is not affiliated with or endorsed by the ASF. Other product names are used for identification only.*