The incremental index keeps indexing the same files each time it is run. To duplicate:
Rebuild the index from scratch.
Make a change in a repository.
Run the incremental index with debug output (it will indicate the changed file is being reindexed).
Run the incremental index again immediately (it will again indicate that the changed file is being reindexed).
It looks like this happens because the path field in the index is of type TEXT rather than ID. The incremental index tries to remove the old document based on the path name but it doesn't actually find it because the index is based on the parts of the path rather than the entire path. Because the old document isn't removed the indexer keeps thinking that the file is out of date.
I think that there should actually be two fields in the index: (1) full path which is an ID and contains the entire path and (2) the relative path which is of type TEXT and only contains the part of the path relative to the repo root. The file name search should be on the relative path. The full path should be used to remove documents during incremental indexing.
While investigating this I also noticed that if you do a file name search on the repositories location path you will get every single file in all repositories (for example, my repositories are located in c:\hg\repos--if I search on //hg// or //repos// then I get all files in the results). This is because it's searching the full file path rather than just the portion relative to the repository.
I'm running on Windows but I'm pretty sure this would apply to Linux too.