Hi, the problem comes from the way the fulltext search is run against the fulltext_search table in the database. My uderstanding is that this table is updated each time a ressource is added, updated or deleted. In this table, the field “text” holds a concatenation of the values of the text properties of the resource.
Looking at the code of the file /omeka-s/application/Module.php, you find the following:
public function searchFulltext(ZendEvent $event)
{
...
$match = 'MATCH(omeka_fulltext_search.title, omeka_fulltext_search.text) AGAINST (:omeka_fulltext_search)';
...
This means that the fulltext search is done by using MySQL MATCH() and AGAINST() functions in the query.
Let’s say you are looking for the word “rabbit”. The resulting query will look a bit like this:
SELECT * FROM fulltext_search WHERE MATCH(title, text) AGAINST('rabbit')
which will return only the resources that contain the exact word “rabbit” but not the ones that contain “rabbits” for example.
The solution to your problem would be to modify the query like this:
SELECT * FROM fulltext_search WHERE MATCH(title, text) AGAINST('*rabbit*' IN BOOLEAN MODE)
A “functional hack” can be to modify the Module.php like this:
public function searchFulltext(ZendEvent $event)
{
...
// $match = 'MATCH(omeka_fulltext_search.title, omeka_fulltext_search.text) AGAINST (:omeka_fulltext_search)';
$query['fulltext_search'] = sprintf('*%s*', $query['fulltext_search']);
$match = 'MATCH(omeka_fulltext_search.title, omeka_fulltext_search.text) AGAINST (:omeka_fulltext_search IN BOOLEAN MODE)';
...
Of course, remember this is a hack 