Symbole in Abfragezeichenfolge für die elastische Suche
Ich habe "Dokumente" (Activerecords) mit einem Attribut namens Abweichungen. Das Attribut hat Werte wie "Bin X" "Bin $0$quot; "Bin q" "Bin%" usw.
Ich versuche, das Attribut mit Hilfe von Reifen- / Gummisuche zu suchen. Ich verwende den Whitespace-Analyzer, um das Abweichungsattribut zu indizieren. Hier ist mein Code zum Erstellen der Indizes:
settings :analysis => {
:filter => {
:ngram_filter => {
:type => "nGram",
:min_gram => 2,
:max_gram => 255
},
:deviation_filter => {
:type => "word_delimiter",
:type_table => ['$ => ALPHA']
}
},
:analyzer => {
:ngram_analyzer => {
:type => "custom",
:tokenizer => "standard",
:filter => ["lowercase", "ngram_filter"]
},
:deviation_analyzer => {
:type => "custom",
:tokenizer => "whitespace",
:filter => ["lowercase"]
}
}
} do
mapping do
indexes :id, :type => 'integer'
[:equipment, :step, :recipe, :details, :description].each do |attribute|
indexes attribute, :type => 'string', :analyzer => 'ngram_analyzer'
end
indexes :deviation, :analyzer => 'whitespace'
end
end
Die Suche scheint gut zu funktionieren, wenn die Abfragezeichenfolge keine Sonderzeichen enthält. Zum BeispielBin X
gibt nur die Datensätze zurück, die die Wörter enthaltenBin
UNDX
in ihnen. Allerdings auf der Suche nach so etwas wieBin $
oderBin %
Zeigt alle Ergebnisse an, die das Wort habenBin
Das Symbol wird fast ignoriert (Ergebnisse mit dem Symbol werden in der Suche höher angezeigt, wenn das Ergebnis ohne angezeigt wird).
Hier ist die Suchmethode, die ich erstellt habe
def self.search(params)
tire.search(load: true) do
query { string "#{params[:term].downcase}:#{params[:query]}", default_operator: "AND" }
size 1000
end
end
Und so baue ich das Suchformular auf:
<div>
<%= form_tag issues_path, :class=> "formtastic issue", method: :get do %>
<fieldset class="inputs">
<ol>
<li class="string input medium search query optional stringish inline">
<% opts = ["Description", "Detail","Deviation","Equipment","Recipe", "Step"] %>
<%= select_tag :term, options_for_select(opts, params[:term]) %>
<%= text_field_tag :query, params[:query] %>
<%= submit_tag "Search", name: nil, class: "btn" %>
</li>
</ol>
</fieldset>
<% end %>
</div>