Как сделать поиск синонимов по регулярным выражениям в solr 5.3.1? - PullRequest
0 голосов
/ 12 июня 2019

Я пишу солнечное пятно для большой базы данных генов. Лиганды и рецепторы генов названы с нормальным названием гена, за которым следует «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 == "()"   

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я понимаю, что это не твой вопрос.Но, похоже, что здесь:

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

Вы можете использовать map, compact и uniq, например:

gene_ids = search.results.map do |result|
  result.gene_id unless result.gene_name.nil?
end.compact.uniq

Кроме того, я никогда не использую find_by_sql и я не очень понимаю, что ты там делаешь.Но мне интересно, не могли бы вы использовать стандартный запрос ActiveRecord там?

0 голосов
/ 12 июня 2019

Кажется, я это исправил, но это неудачный обходной путь, где я только что добавил

    @str.downcase!
    @str.gsub!(" ligand", "l")
    @str.gsub!(" receptor","r")
    params[:search][:search_str] = @str

перед ранее упомянутым разделом кода. @str - это разобранная версия params [: search] [: search_str]

...