-
Notifications
You must be signed in to change notification settings - Fork 15
Searching Inside Tickets
The ticket search used to answer one question: which ticket is this? You gave it a reference, an address or a subject, and it found the ticket.
It now answers a second, harder one: which tickets mention this? β looking inside every message and every note, not just the subject line. A phrase buried in the fourth reply of a two-year-old ticket is findable.
Open the search icon above the ticket list. The window has a new field:
Anywhere in the ticket β words from a message, a note, or a subject
Type into that box and press Enter. The three fields above it are unchanged and still do exactly what they did before, so nothing you already rely on has moved.
If you fill in both, the content search wins β it is the more specific thing you asked for.
Each result shows the ticket reference and subject as before, plus two new things:
- a snippet β the text around your match, so you can tell whether it is the ticket you wanted without opening it
- where it was found β subject, message or note, and how many other places in that ticket also matched
A ticket appears once, however many of its messages match. Without that, one long thread that mentions your word ten times would fill the entire first page.
| Type this | And you get |
|---|---|
printer jam |
Tickets containing both words, anywhere, in any order |
"printer jam" |
Only that exact phrase, those words in that order |
printer -jam |
Messages with printer but not jam |
Three things are worth knowing, because they explain results that would otherwise look wrong.
Word order never matters (unless you use quotes). Searching tower london finds "Tower of London".
Plurals are not automatic, but mostly work anyway. The database treats printer and printers as unrelated words. FreeITSM softens this by matching word beginnings, so printer does find printers β but printers will not find printer. If a search comes back thin, try the shorter form of the word.
Spelling has to be right. There is no "did you mean". A single transposed letter finds nothing.
Databases do not remember very short words β usually anything under three letters. If you search for one, FreeITSM tells you rather than pretending nothing matched, because an empty page would read as "that is not in your tickets", which would not be true.
The text inside attachments is searched, so a phrase buried in a spreadsheet somebody sent two years ago will turn up.
| Read straight away | Read once you add a document reader |
|---|---|
Word (.docx), Excel (.xlsx), PowerPoint (.pptx) |
|
Plain text, .csv, .log, .md, .json, .xml
|
Older Office files (.doc, .xls, .ppt) |
| Scanned documents and photographs of text |
A file is read once, when it arrives. Nothing needs running on a schedule for the left-hand column.
Those need a separate document-reading service, because reliably pulling text out of a PDF is a genuinely hard problem β and a scanned invoice is harder still, since it contains no text at all, only a picture of text.
Set one up under System β Integrations β Apache Tika. It is one command to run and one address to paste in, and the page walks you through it. Once it is connected FreeITSM will read PDFs, older Office files, and run character recognition over scans and photographs β a picture of an invoice becomes searchable text.
If you have Docker, that command is:
docker run -d --name tika --restart unless-stopped \
-p 127.0.0.1:9998:9998 apache/tika:latest-fullThen paste http://127.0.0.1:9998 into the settings page and press Test connection. There is no account to create and no key to paste, because there is nobody on the other end to have an account with.
β οΈ Use the-fullimage, and bind it to localhost. Two details that matter more than they look:
- The plain
apache/tika:latesthas no OCR engine. With it, PDFs and older Office files read perfectly well and scans come back successfully with no text in them β the one failure the status screen cannot flag, because as far as it is concerned the file was read.-p 127.0.0.1:9998:9998keeps it reachable only from that machine. Tika has no authentication of its own, so it must never be exposed beyond a network you control.
Switching it on automatically queues everything that could not be read before, so attachments already sitting on your tickets are picked up without a rebuild.
The full list it adds:
| Formats | |
|---|---|
.pdf |
|
| Legacy Office |
.doc .xls .ppt
|
| OpenDocument and RTF |
.odt .ods .odp .rtf
|
| Forwarded mail |
.eml .msg
|
| Scans and photos, by OCR |
.png .jpg .tif .bmp .gif .heic .webp
|
Because those take much longer to read than a Word file, they are done in the background. Tickets β Settings β Indexing decides when: on a schedule, or a few at a time while people are using FreeITSM. Both are on to begin with, so it works whether or not you run scheduled tasks.
System β Search tells you, by name. As well as the totals, it lists the attachments that are not searchable β the file, the ticket it is on, and why: too large, format not supported, or could not be read.
That matters because a search that silently found nothing, when the file was never readable in the first place, teaches you the information is not there. Seeing the filename and the reason tells you to go and open it yourself instead.
Filenames. Searching inside tickets matches the contents of an attachment, not what it is called.
Two steps, both genuinely one-off.
1. Create the index. Open System β Database Verification and run it. That creates the table the search uses.
2. Fill it with the tickets you already have. From a command line in the FreeITSM folder:
php scripts/search_backfill.php
It reads every ticket subject, message and note already in your database and makes them searchable. On a small installation this takes seconds. It is safe to run again at any time β re-running updates what is there rather than duplicating it.
From then on it looks after itself. New tickets, replies and notes are indexed as they happen, whether they arrive from an analyst, the self-service portal or by email, and a ticket you send to the trash drops out of the search immediately. You do not need to run anything on a schedule.
System β Search shows what the index holds: how many entries, how many of your tickets and articles are in it, when it last changed, and whether anything is missing. There is a Rebuild index button there too, so you never need a command line again β useful on hosting that does not give you one.
It rebuilds in slices with a progress bar, so a large installation cannot time out halfway through.
- After correcting the full-text settings (see the word-length warning below) β words that were skipped before need re-reading
- If the Search screen says some tickets or articles are not in the index
- After restoring a database from a backup taken before the index existed
The screen also tells you the shortest word your database will search for. That single number explains most cases of "search finds nothing".
Run System β Debug Tools β D007 β Search corpus health. It takes about a second and ends in a plain-English verdict.
It is worth running once when you first set this up, not only when something looks wrong. The reason is that database search fails quietly: your database has settings that decide which words it will even remember, and when one of them is wrong nothing reports an error β searches simply come back empty for certain words while others work perfectly.
The most common example is a limit on how long a word can be. Some database installations ship with that set to ten characters, which makes words like authentication, configuration and workstation silently unfindable while shorter words work fine. WAMP on Windows ships this way. D007 spots it and tells you the one line to change.
Asked for in discussion #53.
- π οΈ Search corpus β Developer Guide β how it works underneath
- π Full-text search β the design β what was built, what was ruled out and why
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- Theming & Dark Mode
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
- MobileβFriendly
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- Problem Management
- Tasks
- Assets
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
- Forms
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)