Hi Brenden, thanks for your reply (again!). To answer your questions: yes, I rebuilt the indexes after each time. Yes, the fields are searchable and work perfectly 99% of the time, except for the cases I mentioned.
I appreciate your telling me about Luke, I will definitely check it out. In the meantime, I just learned something after some more experimentation. The reason ZH-32 was not coming back is that it was not ever mentioned in isolation on the page (it was always referred to as ZH-32-2-2). Adding a space so it became ZH-32 -2-2 fixed the issue, and now it is returning the proper result.
The analyzer type I am using, Subset, does support partial matching, and I am not sure why the hyphen is breaking the partial match. A simple experiment is a manufacturer name, Sub-Zero. If you search sub you get a partial match. But if you search sub- or sub-z you get nothing. Search the full string sub-zero and it works fine again.