Я пишу солнечное пятно для большой базы данных генов. Лиганды и рецепторы генов названы с нормальным названием гена, за которым следует «l» или «r», соответственно, поэтому, например, лиганд для гена «MIP2» будет называться «MIP2l». Однако я хочу объяснить случаи, когда ученые будут искать их, используя синтаксис «MIP2-лиганд». Как я могу объединить два токена "MIP2" и "лиганд" в один, а затем объединить их?
Я пытался использовать фабрику фильтров синонимов, но мой solr находится в 5.3.1, поэтому он не загружается. Быстрое обновление неосуществимо. Я также попробовал метод, проиллюстрированный в этой статье (https://lucidworks.com/2014/07/12/solution-for-multi-term-synonyms-in-lucenesolr-using-the-auto-phrasing-tokenfilter/),, но база данных слишком велика для простого документа synonyms.txt. Я хочу использовать для этого регулярные выражения, но не могу без объединения двух токенов в один первый.
Это моя текущая функция поиска, поиск в SQL и странное хеширование - потому что она заменяет старую функцию поиска, а поиск в SQL - это то, как я получаю правильно отформатированные данные для представления.
search = GeneName.search do
fulltext params[:search][:search_str]
order_by(:use_name, :asc)
order_by(:score, :desc)
end
gene_ids = []
for gene_name in search.results
gene_ids << gene_name.gene_id unless gene_name.nil? or gene_ids.include? gene_name.gene_id
end
gene_ids_to_s = gene_ids.to_s.gsub("[","(").gsub("]",")")
#raise gene_ids_to_s.inspect
@genes = Gene.find_by_sql("select distinct g.id gene_id from genes g, gene_names gn where g.id = gn.gene_id and g.id in #{gene_ids_to_s} order by use_name desc") unless gene_ids_to_s == "()"