Title: Opensolr Search
Author: opensolr
Published: <strong>24.4.2026</strong>
Last modified: 16.10.2026

---

Hae lisäosia

![](https://ps.w.org/opensolr-search/assets/banner-772x250.png?rev=3514447)

![](https://ps.w.org/opensolr-search/assets/icon-256x256.png?rev=3514447)

# Opensolr Search

 [opensolr](https://profiles.wordpress.org/opensolr/)

[Lataa](https://downloads.wordpress.org/plugin/opensolr-search.1.0.43.zip)

 * [Tiedot](https://fi.wordpress.org/plugins/opensolr-search/#description)
 * [Arvostelut](https://fi.wordpress.org/plugins/opensolr-search/#reviews)
 *  [Asennus](https://fi.wordpress.org/plugins/opensolr-search/#installation)
 * [Kehitys](https://fi.wordpress.org/plugins/opensolr-search/#developers)

 [Tuki](https://wordpress.org/support/plugin/opensolr-search/)

## Kuvaus

Opensolr Search replaces WordPress’s default search with a powerful, hosted Apache
Solr search engine. It combines traditional keyword search with AI-powered vector
search for dramatically better relevance.

**Key Features:**

 * **Hybrid Search** — combines keyword matching (BM25) with semantic vector search(
   1024-dim embeddings) for the best of both worlds
 * **Faceted Navigation** — filter results by category, price range, date, custom
   fields, and hierarchical taxonomies
 * **AI Hints** — streaming AI-generated answers above search results, powered by
   RAG
 * **AI Reader** — full-screen AI summary of any search result
 * **Chat Bot** — a chat window on your site that answers your visitors from your
   content, run by Opensolr. The Chat Bot tab links straight to its settings for
   your index; one switch there shows it on every page of your site, or add its 
   embed code to the pages you choose
 * **Autocomplete** — real-time search suggestions with query history and Solr results
 * **WooCommerce Support** — index products with prices, categories, SKUs, and structured
   data
 * **Two Indexing Methods** — Web Crawler (automatic) and Data Ingestion API (push
   from WordPress)
 * **Search Analytics** — track queries, clicks, CTR, no-results queries, and visitor
   patterns
 * **Query Elevation** — pin or exclude specific results for any query
 * **Persistent Filters** — admin-defined include/exclude filters applied to every
   search
 * **Multilingual** — automatic locale filtering for WPML and Polylang sites
 * **Dark Theme** — built-in dark mode for the search page
 * **Embeddable** — use native search or embed the Opensolr hosted search widget

**How It Works:**

 1. Sign up at [opensolr.com](https://opensolr.com) and get your API key
 2. Install the plugin and enter your credentials
 3. Create a search index or connect to an existing one
 4. Configure your sitemap and start the web crawler
 5. Your search page is live at `/opensolr-search`

The plugin generates a complete sitemap, injects meta tags for the crawler to extract,
and provides a full search experience with zero load on your WordPress server — 
all search queries go directly to the Opensolr cloud.

**Requirements:**

 * An Opensolr account (free tier available)
 * PHP 8.1 or higher
 * WordPress 6.0 or higher

### External services

This plugin depends on several online services operated by Opensolr ([https://opensolr.com](https://opensolr.com))
to provide hosted search. You must have an Opensolr account; all indexing and search
queries flow through these services. The service is required for core plugin functionality
and cannot be self-hosted.

**Service provider**

 * Opensolr — hosted Solr search cloud and AI API
 * Privacy policy: [https://opensolr.com/learn/privacy-policy](https://opensolr.com/learn/privacy-policy)
 * Terms of service: [https://opensolr.com/learn/terms-of-service](https://opensolr.com/learn/terms-of-service)
 * Account signup (free tier available): [https://opensolr.com/register](https://opensolr.com/register)

**Endpoints the plugin contacts**

 * `https://opensolr.com/solr_manager/api/*` — account management, index create/
   reload, config upload, sitemap registration, elevation toggle, crawl start/stop/
   stats. Called from WordPress admin (not from visitors’ browsers).
 * `https://api.opensolr.com/solr_manager/api/ingest` — Data Ingestion API: pushes
   your post content + metadata to the search index. Called from the WordPress site(
   cron worker and the real-time sync on post save/delete), never from visitors.
 * `https://api.opensolr.com/solr_manager/api/embed` — generates a 1024-dim semantic
   embedding for the current search query (AI/hybrid search path only). Called from
   the WordPress site on every AI/hybrid search.
 * `https://api.opensolr.com/solr_manager/api/embed_and_search` — finds the documents
   in your own index that an AI Hints answer should be based on. Called from the
   WordPress site only when the admin has enabled AI Hints.
 * `https://api.opensolr.com/solr_manager/api/ai_summary` — streams the AI Hints/
   AI Reader answer. Called from the WordPress site only when the admin has enabled
   those features.
 * `https://<your-solr-host>.solrcluster.com/solr/<your-index>/select` — the Solr
   search request itself (host provided by Opensolr when you create an index). Called
   from the WordPress site on every search.
 * `https://search.opensolr.com/embed.js` — loaded ONLY if the admin switches Search
   Mode to ”Embeddable”. In Native mode (the default), this script is never loaded.

**Data sent to these services**

 * Your Opensolr email + API key (authentication).
 * Your site’s host name (`meta_domain`).
 * For ingestion: post titles, content, URL, excerpt, author display name, taxonomy
   terms, publish dates, WooCommerce price + category + SKU, featured-image URL.
   Only for the post types you explicitly enable in the plugin settings. Never includes
   user login data, email addresses, or passwords.
 * For search: the search query string, the active facet filters, pagination position.
 * For AI features (when enabled): the search query, plus the text of the top 4 
   matching documents from your own index, so the AI can compose an answer grounded
   in your content. This is your own already-indexed content being sent back for
   the answer — nothing new is collected from visitors.
 * For click tracking (when enabled): the clicked result URL, title, position, the
   search query, and a SHA-256 hash of the visitor’s IP (never the raw IP). Analytics
   can be disabled from the plugin’s Search Display settings.

No data is shared with any third party — all traffic goes only to `opensolr.com`/`
api.opensolr.com` / `*.solrcluster.com` (and only to `search.opensolr.com` if you
explicitly enable Embeddable mode).

## Asennus

 1. Upload the `opensolr-search` folder to `/wp-content/plugins/`
 2. Activate the plugin through the Plugins menu
 3. Go to Settings > Opensolr Search
 4. Enter your Opensolr email and API key
 5. Click ”Save & Connect” to create or select a search index
 6. Register your sitemap and start the crawler
 7. Visit `/opensolr-search` to see your search page

## UKK

### Do I need an Opensolr account?

Yes. Opensolr Search uses the Opensolr hosted search infrastructure. You can sign
up for free at [opensolr.com](https://opensolr.com). Keyword search works out of
the box on every plan. AI features (vector search, AI Hints, AI Reader) are available
on tailored plans.

### Does this replace WordPress default search?

Yes. Once configured, the plugin provides a complete search experience at `/opensolr-
search` with faceted navigation, autocomplete, highlighting, and more.

### Does it work with WooCommerce?

Yes. The plugin automatically detects WooCommerce products and indexes them with
prices, categories, SKUs, and structured product data.

### What about multilingual sites?

The plugin supports WPML and Polylang. When a multilingual plugin is active, search
results are automatically filtered to the current language.

### How does indexing work?

Two methods: (1) The Web Crawler fetches your pages from the sitemap and indexes
the content. (2) Data Ingestion pushes content directly from WordPress to Solr, 
with real-time sync on post save/delete and bulk async ingestion.

### Where are search queries processed?

All search queries are sent directly from the visitor’s browser to the Opensolr 
cloud infrastructure. This means zero search load on your WordPress server.

### Can I opt out of click/query tracking?

Yes. The Analytics toggle in the plugin settings disables all query and click logging.
With Analytics disabled, nothing is written to the plugin’s local analytics tables.
IP addresses are always SHA-256 hashed before storage regardless of this setting—
raw IPs are never stored.

### Which search operators can visitors use?

Quotes for a phrase, `+` to require a term and `-` to exclude one, and the prefixes
work on
 phrases too: `+laptop +"13 inch" -refurbished` returns only 13-inch laptops
and never a refurbished one. A prefixed term becomes a filter over the whole result
set, so an exclusion holds whether AI search is on or off. An unprefixed phrase 
influences ranking on the keyword side — use `+"..."` when you need it enforced.`
+` and `-` only count at the start of a word, so `e-mail` and `covid-19` are searched
for literally.

## Arvostelut

There are no reviews for this plugin.

## Avustajat & Kehittäjät

“Opensolr Search” perustuu avoimeen lähdekoodiin. Seuraavat henkilöt ovat osallistuneet
tämän lisäosan kehittämiseen.

Avustajat

 *   [ opensolr ](https://profiles.wordpress.org/opensolr/)

[Käännä “Opensolr Search” omalle kielellesi.](https://translate.wordpress.org/projects/wp-plugins/opensolr-search)

### Oletko kiinnostunut kehitystyöstä?

[Browse the code](https://plugins.trac.wordpress.org/browser/opensolr-search/), 
check out the [SVN repository](https://plugins.svn.wordpress.org/opensolr-search/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/opensolr-search/)
by [RSS](https://plugins.trac.wordpress.org/log/opensolr-search/?limit=100&mode=stop_on_copy&format=rss).

## Muutosloki

#### 1.0.43

 * Added: The Chat Bot on every page: one switch in your Opensolr Control Panel (
   Chat Bot of your index, Embed code: Show the chat on the hosted search page and
   on your Drupal or WordPress site) now shows the chat on every page of your site,
   once the domain of your site is in Domains of your site. The plugin reads the
   switch again when you open its Chat Bot tab, and on its own every ten minutes.
   To show the chat only on some pages, leave the switch off and add the embed code
   to those pages.

#### 1.0.42

 * Fixed: hierarchical facets (such as categories from breadcrumbs) no longer slow
   the search page down on large sites. The search used to ask Solr for the whole
   category tree, every level of every branch, on each search; with deep breadcrumbs
   that took over a second and a half. It now asks only for what the page shows:
   the branch the visitor is in, the level on display and the one below it. The 
   facet looks and works exactly as before.

#### 1.0.41

 * Added: a Chat Bot tab. Opensolr runs an out of the box chat bot that answers 
   your visitors from the content of your index and links every page it mentions.
   The tab opens the Chat Bot of your connected index in one click and lists the
   four steps: add the domains of your site, save, and add the one-line embed code
   to your pages. Settings, stats and the history of every conversation are in your
   Opensolr Control Panel. Documentation: https://opensolr.com/wordpress-search-
   docs/chat-bot

#### 1.0.40

 * Changed: the Documents tab shows each PDF once, with its best matching pages 
   right under it, instead of repeating the document for every page. The group header
   shows the PDF’s real page count, and Show more pages loads the document’s next
   matching pages in place.
 * Fixed: only the bottom line of a PDF group header stayed on screen while scrolling.
   The whole header, with the document’s title and page details, now stays pinned
   right below the search box.
 * Fixed: search suggestions only matched the beginning of a past search, so typing`
   curre` never offered `8558A Alternative Current`. Suggestions now match the start
   of any word in a past search, in any order (`alterna`, `curre`, `alternative 
   curr`). Searches that start with what was typed still rank first, then the most
   searched ones. Past searches are kept in their own tables, so the lookup stays
   fast whatever the size of the search log; existing logs are filled in automatically
   after the update.
 * Fixed: nothing on the search page stayed on screen while scrolling. The search
   box, the PDF group headers and, on desktop, the sort / Fresh / AI row and the
   facet sidebar are now pinned under the admin bar.
 * Fixed: the facet sidebar scrolled away with the results. On desktop it now stays
   pinned and scrolls on its own, always fitting the screen, so with infinite scroll
   every facet is still reachable.
 * Fixed: a search form in the theme header right above the search page could be
   partly covered by the search box.

#### 1.0.39

 * Added: PDF results are shown page by page. The Opensolr Web Crawler and Data 
   Ingestion now index every PDF as one document per page, so a search lands on 
   the page that actually answers it. Each page result carries a Page N pill that
   opens the PDF at that page.
 * Added: pages of the same PDF that follow each other in the results are grouped
   under the document’s title, with how many of its pages matched. The five best
   pages are shown, the rest open with one click, and the group header stays on 
   screen while scrolling.
 * Added: Read Page summarises the page that matched; Read Document summarises the
   whole PDF, every page in order.
 * Added: page results show the PDF’s page count and creation date.

#### 1.0.38

 * Fixed: the `+word` and `-word` search operators did nothing when AI search was
   on. They are ordinary keyword-search syntax, so they only ever bound the keyword
   half of a hybrid search, and every result the keyword half excluded came back
   in through the semantic half. Exclusion failed twice over, because the query 
   was embedded with the minus sign still in it and an embedding model has no concept
   of negation, so `-Ruben` read as one more word and pulled results towards Ruben.
   Operators are now applied as filters over the whole result set.
 * Fixed: quoted phrases were stripped out of hybrid queries, so `"machine learning"`
   searched for the two words separately. Phrases now survive, and `+"machine learning"`/`-"
   open box"` work as required and excluded phrases.

#### 1.0.37

 * Fixed: the ingestion cron now retries a batch that failed instead of skipping
   it, so documents are no longer silently left out of the index.
 * Fixed: the WPML language filter now uses the language’s full locale, so results
   are scoped to the right language.
 * Fixed: the plan badge on the settings screen showed a meaningless 0.00 price 
   on free accounts. It now reads ”free forever”, and paid plans still show their
   price.
 * Added: the ”did you mean” spelling suggestion now also appears when AI search
   is on; only image search hides it.
 * Changed: on the search page the sort dropdowns are easier to read, and the result
   count sits on the controls row.
 * Changed: wording updated throughout — the Opensolr free plan no longer expires
   after 15 days, it is free forever with no credit card.

#### 1.0.36

 * Security: hardened the search-as-you-type (autocomplete) so a specially crafted
   query can no longer change how the search is parsed on the server.
 * Fixed: the search-as-you-type suggestions now line up directly under the search
   box.

#### 1.0.35

 * Added: Search by image. A camera button on the search box turns a photo into 
   a search — it reads the picture as CLIP labels, OCR text or a barcode, keeps 
   the thumbnail on screen, and offers a ”search by picture meaning” alternative.
   A spinner shows while the picture is read.
 * Added: result thumbnails grow on hover and open full size in a lightbox with 
   the page title linked underneath; the searched image opens the same viewer with
   the words and codes it was read as.
 * Added: an AI (hybrid) search toggle on the results page, so a visitor can switch
   between hybrid vector search and pure keyword search per search.
 * Added: a Duration facet widget that renders an h:mm:ss min/max slider for integer-
   seconds fields such as video length.
 * Added: the facet Filter box now searches the complete value list of a field, 
   not just the values already shown; the same values power the ”Show all” dialog
   with a single fetch.
 * Added: ”Use an existing index” during setup, so you can attach the plugin to 
   any index your Opensolr account already owns instead of only creating a new one.
 * Added: richer document results — page count, content type, detected language,
   author and modification date.
 * Fixed: the search box no longer overflows on narrow phones, and the search UI
   now uses the full width on mobile.
 * Fixed: spellcheck suggestions are suppressed on an image search and when AI search
   is on.

#### 1.0.34

 * Security: password-protected posts are no longer indexed. They are published,
   so the previous check let them through, and the indexed body was the expanded
   content rather than the password form — their full text was readable from the
   search results page.
 * Security: WooCommerce products marked Hidden or Exclude from search are no longer
   indexed. Visibility is stored in the product_visibility taxonomy, which the plugin
   never consulted.
 * Fixed: product price, sale price, stock and SKU changes now reach the index. 
   WooCommerce stores them in post meta and does not fire save_post, so an order
   decrementing stock, a scheduled sale starting or a bulk price edit never updated
   the index and price sorting and filtering used stale values.
 * Fixed: Save & Start Fresh no longer deletes the existing index before its replacement
   has been created, so a transient API error can no longer leave the site with 
   neither.
 * Fixed: four settings could never be saved — Browse mode, Infinite scroll, a custom
   Minimum Match expression, and any crawler Request Delay below one second, which
   was stored as zero and told the crawler not to wait at all.
 * Fixed: the Hierarchical (drill-down) facet widget was silently downgraded to 
   List on save, and the per-facet minimum count was discarded on every save.
 * Fixed: the facet order set by dragging rows was scrambled on the next page load
   and then saved in that scrambled order.
 * Fixed: the embedded search widget rendered below the page footer and only occupied
   part of the viewport; it now fills the content area.
 * Fixed: the Data Crawler tab always reported 0 URLs in sitemap.
 * Fixed: the AI panel could render an error page as though it were the answer.
 * Added: the ingest job reports how many items were skipped because they are not
   publicly viewable.
 * Added: links to the embed parameter documentation from the Search Page tab.

#### 1.0.33

 * Fix: **Deleting a PDF or Office document left it searchable forever.** Removing
   a document from your Media Library never removed it from the index, so visitors
   kept finding a file that no longer existed on your site, and clicking it led 
   nowhere. Deletions now take effect immediately.
 * Fix: **Replacing a file left the old text in your search results alongside the
   new.** If a replacement was uploaded under a different filename, the previous
   version stayed indexed, so a search could return both the old and the new document.
   The superseded version is now removed as the replacement is indexed.
 * New: **Newly uploaded documents are searchable straight away.** A PDF or Office
   file added to the Media Library used to wait for the next bulk ingestion run 
   before it appeared in search. It is now indexed as it is uploaded.
 * Changed: A redundant clause was removed from the autocomplete query. It could
   never match anything, so suggestions are unchanged and marginally faster.

#### 1.0.32

 * Fix: **Your search settings no longer reset when you move around the results.**
   Switching between the Web and Documents tabs, clicking ”Clear all” on the filters,
   or following a spelling suggestion rebuilt the link from scratch, so anything
   you had chosen — the **Fresh** toggle, your sort order, your active filters —
   was silently dropped and the page came back ranked differently with no explanation.
   Those links now carry your full search state. ”Clear all” still clears your filters,
   but keeps the tab, the sort and the Fresh toggle, because those are not filters.

#### 1.0.31

 * New: **Fresh Results Bias Weight**, on the Search Tuning tab. The **Fresh** toggle
   on your results page stays the visitor’s choice; this new slider decides how 
   hard it pushes on your site. At 0.1 recency is little more than a tiebreaker;
   at 1.0 the publication date all but replaces relevance, so the newest matching
   post wins almost regardless of how well it matches. The slider tells you what
   your chosen value means in plain terms — ”half its boost after about 2 days”.
 * Fix: **Posts with no publication date no longer float to the top when Fresh is
   on.** The recency curve returns its maximum value for a missing date, so an undated
   post was being scored as though it had been published that very second — the 
   exact opposite of what the toggle promises. Undated posts are now left out while
   Fresh is on.
 * Changed: Fresh is noticeably stronger out of the box. The old curve halved a 
   post’s boost only after a year, which on a site posting weekly was too gentle
   to change anything visible; the default now halves it after about ten days.

#### 1.0.30

 * Changed: The **Fresh** control has moved up beside AI Hints, where the rest of
   the search controls live, and is now an on/off switch instead of a button. It
   reads at a glance whether newer results are being favoured, and it is easier 
   to hit on a phone. How it ranks is unchanged.

#### 1.0.29

 * New: Fresh Results Bias. A **Fresh** toggle now sits beside the sort controls
   on your search results page, and it belongs to whoever is searching rather than
   to whoever set the site up. With it on, newer content ranks higher — a page published
   today counts about twice as much as the same page a year old. It changes the 
   order of your results only: nothing is hidden, the result count is unchanged,
   and pages with no publication date keep the position their relevance earns them.
   Off by default, and the choice stays in the URL so a search can be bookmarked
   or shared. When it is on it also applies to the pages AI Hints answers from, 
   so the answer comes from the same recent results listed underneath it.
 * Fix: AI Hints now read the actual pages behind your results. The assistant was
   only ever shown the short teaser lines already visible on screen, so it answered
   from a few sentences rather than from your content, and on many sites it received
   nothing at all. It now reads the full text of the most relevant matches, straight
   from your index.
 * Fix: AI Hints work on indexes that are not built by the web crawler. Documents
   added through the Data Ingestion API, and files such as PDFs and Office documents,
   were being filtered out of the AI answer even though they show up in search results.
 * Changed: Answers are noticeably better grounded. Each matched document is now
   given to the assistant as its own clearly separated section, with the passages
   your search actually matched shown first, and the question asked last — the arrangement
   that measured best. Answers stay short and specific, name the people, places 
   and numbers involved, and say plainly when your content does not cover the question
   instead of hedging around it.
 * Fix: Very long search queries no longer crowd the content out of the answer; 
   queries are capped at 500 characters.

#### 1.0.28

 * Changed: The Document Reader now retells the page as a readable briefing in its
   own words instead of reproducing it word for word. Promotional blocks inside 
   the page are no longer copied into the reading view, and the output ends cleanly
   instead of trailing off.
 * Fix: The AI context reaches the assistant exactly as written. HTML and code examples
   are no longer entity-encoded on the way in, and punctuation and line structure
   are preserved, which noticeably improves answer quality.

#### 1.0.27

 * Changed: AI Hints answers are fuller and properly formatted. The previous release
   capped the answer at two to four sentences, which compressed a page of source
   material into one dense paragraph. Answers now cover every relevant point the
   matched content offers, with the concrete details, rendered as short paragraphs
   and bullet lists instead of a wall of text.
 * Changed: The assistant no longer fills gaps from its own knowledge. It is now
   told explicitly to use only what your indexed content states, so it stops padding
   answers with plausible advice and product names that appear nowhere on your site.
 * Fix: Answers no longer open with ”Yes” regardless of the question. The previous
   wording named the word inside the rule itself and the model repeated it even 
   where it made no sense.

#### 1.0.26

 * Changed: AI Hints now answer your question instead of describing the results.
   The assistant leads with the concrete facts from the matched content (who, what,
   where, when) rather than opening with a preamble about what the content does 
   or does not cover, and it no longer contradicts itself by saying the content 
   does not address the question and then answering it anyway. Yes/no questions 
   get a straight ”Yes” when the content supports one; every other question opens
   with the fact itself.
 * Fix: The question is no longer echoed back as a heading above the AI Hints answer.
 * Changed: The Document Reader now gives a readable rendition of the full source
   text instead of a condensed summary that always opened with ”Context Overview”
   and ”Key Points”, so you can read a result without opening the original page.

#### 1.0.25

 * Changed: The search page is now a real WordPress Page at `/opensolr-search/` 
   containing the `[opensolr_search]` shortcode, so your theme renders it with your
   own header, navigation and footer instead of as a standalone, theme-less page.
   The URL does not change. The page is created automatically on activation and 
   upgrade — nothing to configure. If it is ever deleted, the plugin recreates it
   and keeps serving the same URL in the meantime.
 * Fix: Plugin CSS and JavaScript now load wherever the `[opensolr_search]` shortcode
   is used, not only on the built-in search route. Previously the shortcode rendered
   completely unstyled on any other page.
 * Fix: The search page is excluded from the generated sitemap and from Data Ingestion,
   so it can no longer be indexed and appear as a result inside its own result list.
 * Fix: Result pagination now uses `opensolr_page` instead of `page`. `page` is 
   a reserved WordPress query var, so on a real Page it was answered with a redirect
   and paging silently stopped working. Old `page` links are still honoured.
 * Changed: You can now rename, move or re-slug the search page like any other WordPress
   page — the search form, facets, sorting, pagination, the ”Open Search Page” button
   and the page’s canonical/og:url all follow the page’s real permalink instead 
   of a hardcoded `/opensolr-search/`.
 * Changed: The theme’s page title is no longer printed above the search box, and
   the template’s top spacing is trimmed, so the search sits directly under your
   site header instead of below a screen of empty space. Your site header, navigation
   and footer are shown as on any other page.
 * Fix: Plugin CSS and JavaScript are cache-busted per file change, so style and
   script updates reach visitors immediately instead of after a hard refresh.

#### 1.0.24

 * Fix: Removed leftover diagnostic logging from the Facet Mapping save handler.
   Every save wrote the raw POST payload to `/tmp/opensolr-facets-save.log` and 
   to the PHP error log — noise on your server, and unnecessary exposure of submitted
   field data. Shipped inadvertently since 1.0.19.
 * Fix: Corrected a Plugin Check nonce-verification warning on the Data Ingestion
   save handler (suppression comment was attached to the wrong line). The nonce 
   itself was, and remains, verified before any POST data is read.

#### 1.0.23

 * Compatibility: Verified against WordPress 7.1. No code changes were required —
   the plugin adds nothing to the block editor, the admin toolbar, or the media-
   processing pipeline, and it ships zero jQuery / jQuery UI / @wordpress/components
   dependencies, so the iframed editor, client-side media processing, persistent
   toolbar, jQuery UI 1.14.2 and editor component changes in 7.1 do not affect it.
   Admin assets remain scoped to the Opensolr Search settings screen only.

#### 1.0.22

 * Improved: Hybrid search now uses the Opensolr {!hybrid} query parser for correct
   keyword + vector score fusion. Search Mode (Union / KW Required / Meaning Required/
   Intersection) now shapes which results are considered, not just how they are 
   scored. Vector search on documents (non-HTML content such as PDFs) now returns
   results.
 * Changed: Removed edismax phrase boosts and the Minimum Relevance Score control.
   Both are obsolete under the new parser and could bury the actual relevant products/
   pages or drop legitimate document matches.

#### 1.0.21

 * Fix: File / Document / Audio / Video media mappings now emit a real public
    URL
   instead of the bare attachment ID. Previous versions only resolved IMAGE attachments—
   mapping a PDF / DOCX / MP4 / MP3 attachment ID through Facet Mapping silently
   kept the integer in Solr. Now any image, video, audio, or known document MIME(
   PDF / DOC / DOCX / XLS / XLSX / PPT / PPTX / ODT / ODS / TXT) auto-resolves to
   its public URL.
 * Fix: ACF ”Image Array” / ”File Array” return format no longer pollutes
    Solr 
   with a mix of id + alt + title + url + width + height. The flatten pass now detects
   the ACF attachment shape and emits ONE value per row — the `url` if present, 
   otherwise the `ID` (which then resolves through the normal attachment-URL pipeline).
   Single-mode AND multi-mode mappings both produce clean URL values.
 * Fix: Values that are already URLs (`http://…` / `https://…`) pass through
    unchanged—
   covers ACF ”Return Format = URL” + hand-rolled custom-field patterns. Previously
   the resolver only fired on numeric IDs, leaving everything else as-is, which 
   was already correct for URLs but is now documented and explicit.

#### 1.0.20

 * New: Date-range quick presets on facet sidebar — every date_range facet
    now 
   renders three pill buttons (Today / Last Week / Last Month) above the From/To
   inputs. One click fills both dates and submits the facet form — no more opening
   the native date picker twice for common queries. Uses LOCAL date components (
   not toISOString) so ”Today” stays today in every timezone.
 * New: Data Ingestion tab — live ”Total: N documents” tally and dynamic
    per-type
   counts. Check or uncheck a content type and the number next to that type flips
   between its real count and 0, with the grand total at the bottom of the fieldset
   updating instantly. Mirrors the Drupal module’s ingestion UX. Include attached
   files toggle also contributes to the total.

#### 1.0.19

First public release since 1.0.14. Rolls up every intermediate deploy.
 * New: Facet
Mapping form now matches the Drupal module — Solr Field Name + Solr Type dropdown
+ Display Label. Pick a WP field and the Solr Type auto-fills from the detected 
suffix; stem auto-fills from the WP field name. Type hints shown next to every entry
in the WordPress Field dropdown (post_tag  multi, string; _price  single, float;
etc.). * New: WordPress Field dropdown shows every indexable source, not just a 
handful of postmeta keys. Core post columns (post\_title, post\_content, post\_excerpt,
post\_date, post\_status, post\_type, post\_author), ALL postmeta (underscore-prefixed
included — \_price/\_sku/\_stock/\_thumbnail\_id are now mappable), register\_meta()
keys, every public taxonomy, all pa* WooCommerce attribute taxonomies, plus synthetic
featured\_image\_url and gallery\_image\_urls. * New: Core post columns and WC synthetic
aggregates resolve end-to-end in both ingestion and tag emission. * Fix: Facet Mapping
saves no longer silently drop every row. The sanitize callback hooked via register\
_setting() expected the legacy flat scalar shape and called is\_scalar($dst) on 
each value — every row in the new rich {wp\_field, meta\_name, field\_type, label,
solr\_field} shape was failing the check and being stripped under sanitize\_option\
_opensolr\_settings. Callback now accepts both shapes. * Fix: Multi-valued mappings
stored as serialized arrays in a single postmeta row (ACF Checkbox / Select multi/
Relationship / Gallery fields, WooCommerce attributes) now emit one per value and
serialize as Solr arrays. Both emission and ingestion paths flatten across both 
WP storage patterns (multi-row AND single-row-with-array). * Fix: Admin scripts 
self-invalidate on every deploy via filemtime() cache-busting. Previously OPENSOLR\
_VERSION-based cache-busting meant every intermediate fix shipped to disk without
browsers refetching. * Fix: Facet Mapping table always renders at least one empty
row so the admin has a visible slot to click into. * Fix: + Add Field Mapping button
no longer collides with the placeholder row’s index. * Fix: Backend stem fallback—
save handler derives the Solr Field Name from the WP field name when left empty,
preventing silent row drops on incomplete input.

#### 1.0.14

 * Fix: image-field Facet Mappings now emit a real image URL. Previously,
    mapping
   a meta key that stores an attachment ID (ACF image field returning ”ID”, `_thumbnail_id`,
   custom image_attachment_id, etc.) to a Solr field emitted the bare integer as
   the meta content — useless as an image source. Both ingestion and meta-tag emission
   now auto-resolve numeric values to `wp_get_attachment_url()` when the ID points
   at a valid image attachment. SKU, price, and other numeric fields are untouched(
   guarded by `wp_attachment_is_image()`).

#### 1.0.13

 * Fix: Persistent Filters ”Exclude” mode was silently saved as ”Include”.
    The 
   register_setting() sanitize callback used a `op: include/exclude` shape that 
   didn’t match the `mode: +/-` shape the admin form writes and the query builder
   reads, so any `-` (Exclude) selection was overwritten with the default on save.
   Existing stuck filters need to be re-saved after upgrading to pick up the correct
   mode.

#### 1.0.12

 * New: combobox autocomplete on ”Solr field for result image” in Search
    Display.
   Focusing the input drops down the full alphabetical list of Solr fields indexed
   on your site (from the Luke handler); typing filters by case-insensitive substring
   match. Keyboard navigation (arrows + Enter) and mouse picking supported. New 
   admin-only REST endpoint `/opensolr/v1/luke-fields` with a `manage_options` permission_callback
   feeds the list. JS and CSS enqueued via wp_enqueue_script / `wp_enqueue_style`(
   no inline tags); URL and nonce passed via `wp_localize_script`; all output escaped;
   DOM-based rendering avoids innerHTML. Plain typing still works for field names
   that aren’t indexed yet.

#### 1.0.11

 * New: ”Solr field for result image” input in Search Display settings.
    Default`
   og_image`. Lets admins point result thumbnails at any single-valued Solr field
   they’ve mapped through Facet Mapping (WordPress post meta, WooCommerce gallery,
   custom URL field, etc.). Applies to the search results page, the AI Reader modal,
   and the AI Reader metadata endpoint. Multi-valued sources normalized to the first
   element. Empty or non-alphanumeric input falls back to og_image.

#### 1.0.10

 * Fixed: Facet Mapping entries targeting multi-valued Solr fields
    (`_sm`/`_fm`/`
   _im`/`_dtm`) now work correctly with both the Web Crawler and Data Ingestion 
   paths. Previously the ingest path was broken entirely for field mappings (reading
   config keys the admin UI never wrote), and the meta-tag emission concatenated
   array values into a single comma-joined string. Now:
    - Ingest parses the suffix out of `solr_field` to determine multi vs
       single,
      and writes arrays directly to Solr.
    - Meta-tag emission writes one `<meta property="opensolr:X_sm">` tag
       per value
      so the Opensolr crawler can aggregate them back into an array (DOM order preserved).
    - Hardcoded emissions for `product_images_sm` and variable product
       attribute`*
      _sm` fields updated to the same repeated-tag pattern. Pairs with a crawler
      update that aggregates repeated `opensolr:*` tags.

#### 1.0.9

 * Security: register_setting() sanitize_callback now applies per-field
    sanitization(
   sanitize_text_field, sanitize_email, absint, float clamping, strict enum allowlists,
   recursive array sanitization for facets / filters / content type lists). Previous
   callback only merged input, relying on caller-side sanitization.
 * Security: REST /queue-stats endpoint now requires manage_options. The
    endpoint
   feeds the Data Crawler admin UI (live preview counts for arbitrary content-type
   overrides), so it’s an admin-configuration surface and should not be public.
 * Compliance: JSON-LD structured-data blocks (WebSite SearchAction, Article,
    BreadcrumbList)
   now output via wp_print_inline_script_tag() instead of echoing raw
 * Dependency: Chart.js bundled library updated from 4.5.0 to 4.5.1.

#### 1.0.7

 * New: Lexical Only search mode in Search Tuning  Search Mode. Explicit
    opt-out
   from vector — no embedding API call is made, search runs straight through the
   lexical edismax path. Useful for deterministic BM25 ranking, avoiding embed API
   latency, or users on plans without vector who want explicit control instead of
   the implicit server-side fallback.
 * New: When Lexical Only is selected, the Minimum Relevance Score slider
    auto-
   zeros itself. That threshold is calibrated for the combined hybrid score and 
   would filter out every result in pure lexical mode. Backend forces the value 
   to 0 on save and at query time; JS zeroes the slider live the moment the radio
   is picked. A yellow note explains the coupling.
 * Change: Lexical-only fallback now uses defType=edismax + raw q (idiomatic
    Solr
   style) instead of q={!bool should=$lexicalQuery}. Same behavior, cleaner in the
   Query Inspector, matches the opensolr search_lexical() method for cross-platform
   consistency.
 * Change: Plugin version bumped so browsers pick up the new admin-ui JS
    handler
   for the bool_mode radios.

#### 1.0.5

 * New: Minimum Relevance Score slider in Search Tuning. Drops results whose
    combined{!
   bool}(lexical + vector) score falls below the threshold, cleaning noise from 
   facet counts and result totals. Applied as a Solr frange post-filter on the hybrid
   score. Needed because the {!func}-wrapped lexical side of the {!bool} matches
   every doc (score 0 for non-lexical hits) and KNN topK returns N candidates regardless
   of cosine similarity — without this filter numFound balloons to the entire base
   filter set and facet counts get polluted. Default 0.3; legitimate matches easily
   clear it. Slider moves in 0.1 increments, 0 disables the filter.
 * Change: Plugin version bumped so browsers pick up the new admin-ui JS.
    Without
   the bump, cached old JS had no listener for the new slider and its live label
   wouldn’t update while dragging.

#### 1.0.4

 * Improvement: The Semantic  Lexical Balance slider is now a true balance dial.
   
   Previously it just scaled the qf/pf field-weight boosts linearly (same effect
   as lowering the weights themselves). The lexical score is now reshaped via pow(
   BM25 + 1, lexical_weight) – 1, so the slider changes the SHAPE of the lexical
   contribution curve, not just its magnitude:
    - 1.0 = linear (full BM25, named entities dominate)
    - 0.5 = sqrt-like compression (balanced, new default)
    - 0.2 = heavy compression (vector takes over)
    - 0.1 = lexical almost off
 * Change: Default Title field weight raised from 0.03 to 0.1 and default
    Semantic
   Lexical Balance raised from 0.20 to 0.50. These defaults work better with the
   new pow reshape across a wide range of corpora.
 * Removed: Misleading ”field weights are automatically overridden to 0”
    banner
   in Search Tuning — no longer applies after the hybrid ranking fix in 1.0.3.

#### 1.0.3

 * …

## Metatiedot

 *  Version **1.0.43**
 *  Last updated **1 päivä sitten**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.0 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 8.1 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/opensolr-search/)
 * Tags
 * [autocomplete](https://fi.wordpress.org/plugins/tags/autocomplete/)[faceted search](https://fi.wordpress.org/plugins/tags/faceted-search/)
   [search](https://fi.wordpress.org/plugins/tags/search/)[solr](https://fi.wordpress.org/plugins/tags/solr/)
   [woocommerce search](https://fi.wordpress.org/plugins/tags/woocommerce-search/)
 *  [Edistynyt näkymä](https://fi.wordpress.org/plugins/opensolr-search/advanced/)

## Arvosanat

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/opensolr-search/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/opensolr-search/reviews/)

## Avustajat

 *   [ opensolr ](https://profiles.wordpress.org/opensolr/)

## Tuki

Onko sinulla jotain sanottavaa? Tarvitsetko apua?

 [Tukifoorumi](https://wordpress.org/support/plugin/opensolr-search/)