The search bar that doesn't search
Thailand publishes a lot of open data. More than 51,000 datasets, across more than 5,000 agencies, from more than a hundred sources, plus nearly 800,000 Royal Gazette documents. That is not the problem. The problem is that you cannot find any of it.
Try searching the main government portal for สถานีตำรวจ (police station). The portal's own search returns over twenty thousand results, almost none of them relevant. The reason is not a lack of data. It is that the search engine cannot read Thai.
Thai is written without spaces between words. A search index that splits on spaces sees the entire phrase as one unbreakable token, so it matches against anything that contains any substring, or nothing at all. The result is a haystack with no needles. This is not a minor annoyance. It is the difference between open data being open in principle and open in practice.
Why Thai breaks search engines
Most search technology was built for languages that separate words with spaces. Thai does not. To index Thai properly, you have to segment the text into words first — a task that is genuinely hard, because Thai has no word boundaries and some compounds are ambiguous.
The site that actually solves this does two things. It segments Thai text before indexing, using a proper segmentation routine rather than a naive split. And it builds a weighted index where titles count more than descriptions, with a trigram similarity fallback for cases where segmentation misses a compound. That means a query for a common term returns relevant results instead of twenty thousand false matches.
The segmentation is not perfect. Some compounds stay whole when they should be split, and the site documents that as a known limit. But it is a solved problem in the sense that matters: searching for a police station now returns police stations, not a random sample of everything.
The duplicate problem
Even when you can search, you are not done. The same dataset appears on multiple portals. data.go.th harvests GD Catalog, so a large share of records exist in both places, and provincial GD Catalog instances republish each other's content. If you count what each portal claims, you are counting the same record several times.
The site merges records that share a harvest lineage. It matches on the CKAN harvest identifier first, then on normalised resource URLs. Title-only matches go to a review queue and are never merged automatically, because annual editions of the same dataset share a title year after year. The result is that headline counts here are lower than the sum of the upstream portals' own totals — and that is the point. When you see a dataset count in the tens of thousands, you are seeing unique records, not duplicates wearing different hats.
Dates that lie
Thai data mixes two calendars. Buddhist Era and Common Era appear in the same column, sometimes in the same spreadsheet. A year above 2400 is treated as BE, and 543 is subtracted to get CE. The site stores everything in CE and re-derives BE for the Thai locale at display time. So a tax dataset page will show a consistent calendar, even if the upstream file mixes both. That is the right way to do it, but it means you cannot trust a raw download without checking which calendar it uses.
Money adds another layer. Fiscal years, not calendar years, are used wherever budgets are involved. Thai fiscal year 2568 runs from 1 October 2024 to 30 September 2025. And appropriation is not disbursement. Both are published, and they differ. If you are comparing what a ministry was allocated to what it actually spent, you need the right series.
A practical search walkthrough
Start at the bilingual open data index. The bare path serves Thai; the /en path serves English. Both point at the same records, so you can search in either language and see the same underlying data.
Type a Thai term into the search box. The query is segmented server-side, so the index can find words even when the original text has no spaces. Filter by source, format, licence, or agency. The filters are not decorative — they are how you separate a national dataset from a provincial one, or a CSV from a shapefile.
Open a result. Every dataset page names the agency that published it, the source portal it came from, and the licence that applies. If the licence is absent, the download button points upstream rather than re-serving the file, because absence of a licence is not permission. That is a policy you can verify on every record.
For example, the road system dataset page shows a single normalised record with its provenance attached. You can see which agency published it, which portal supplied it, and whether it is still being updated. That last part matters more than most people realise.
What the numbers actually mean
The site is careful about what it does not do. It is not an official source. The data comes from government agencies, and the site is not run by one. If a number matters to a decision, you check it against the source it links to.
It is also not an investigation. The figures are what the publishers reported, not conclusions drawn from them. Every figure on the site is read from the database, not written into the code. An automated check fails the build if anyone hardcodes a number.
That discipline extends to the edges. Records with corrupt upstream dates are counted and skipped rather than guessed at and repaired. Coordinates are assigned to a province by testing whether the point falls inside the province boundary, not by finding the nearest centroid — because nearest-centroid is wrong along borders, and the failure is silent. Small case counts in small districts are discarded, because a few crimes in a small tambon can identify people. Personal insolvency notices in the Royal Gazette are counted but not stored, so you can know how many there were without building a searchable index of people who went bankrupt twenty years ago.
When the data is missing or failing
Not everything is available. The Comptroller General's e-GP feed on data.go.th has stopped updating. PDMO, which was the best-formatted public debt publisher on the platform, is unreachable. Both remain in the source list, marked as failing. Contract-level procurement after 2023 is missing, because the mirror that supplied it stops there.
Knowing what is missing is part of finding what is there. A tax dataset that carries a fiscal-year label tells you which period it covers — but only if you know that Thai fiscal years start in October. The conventions page exists precisely because these details will otherwise mislead you.
The same honesty applies to licences. Most datasets from data.go.th and GD Catalog carry Thailand's Open Data Common licence, which permits reuse with attribution. A substantial share state no licence at all. Those are analysed and linked back to their source rather than re-served. OpenStreetMap data is held in separate tables so its share-alike obligation does not propagate to data that should not carry it. None of that is visible in a raw portal search. It is exactly the kind of thing you need to know before you build anything.
The rules of engagement
If something is wrong, the site has a corrections page, and every request gets a reply. If you are named and the record is inaccurate, you can ask for it to be checked against the source. If the source is wrong but the site displayed it correctly, your statement is recorded alongside it. Where there is a clear legal or safety reason, the record is removed.
That is the difference between a catalogue and a tool. A catalogue tells you a dataset exists. A tool tells you what it means, what it is missing, and whether you can trust it. Thailand's open data is real and large. The only thing standing between it and the people who need it is a search bar that does not work. That, at least, is fixable.
