Tendangan pencarian tidak mencari beberapa istilah saat menentukan bidang

Adakah yang bisa memberikan saran tentang hal berikut?

Saya menggunakan searchkick / elasticsearch dan ingin mencari istilah kunci atau istilah di berbagai bidang (nama, pabrikan). Jadi misalnya jika saya mencari produk bernama "produk saya" yang dibuat oleh "produsen tertentu" saya, saya berharap hasil ini muncul jika saya mencari "produk saya", "produsen tertentu" atau "produsen produk saya" karena kedua istilah ini disertakan. di kolom nama atau pabrikan.

Masalah saya adalah sebagai berikut:

@products = Product.search query

Mengizinkan semua istilah pencarian yang tercantum di atas dan mengembalikan hasil yang diharapkan segera setelah saya menambahkan

@products = Product.search query, fields: [:name, :manufacturer_name]

Ini hanya akan mengembalikan hasil untuk "produk saya", atau "perusahaan tertentu", tetapi tidak "produk saya perusahaan tertentu".

Sekarang ini bukan masalah besar karena saya dapat menghapus opsi bidang sepenuhnya TETAPI saya perlu menggunakan searchkicks word_start untuk bidang nama. Jadi pertanyaan terakhir saya adalah seperti ini:

@products = Product.search query, fields: [{name: :word_start}, :manufacturer_name]

Saya ingin pengguna mencari string pertama produk dan dapat memasukkan produsen juga misalnya "myprod somecompany" sayangnya ini tidak memberikan hasil apa pun ketika saya berharap ini akan mengembalikan produk bernama myproduct, dibuat oleh somecompany.

Apakah saya melewatkan sesuatu yang sangat jelas di sini? Saya dapat mengubah tambahan

operator: 'or'

tetapi sebenarnya saya ingin dapat melakukan pencarian sebagian pada nama, menambahkan istilah tambahan dan jika keduanya ada untuk catatan tertentu maka akan dikembalikan.

inilah kode model saya juga

class Product < ActiveRecord::Base
 searchkick word_start: [:name]
end

Terima kasih


person drac    schedule 23.09.2015    source sumber
comment
Saya juga mengalami masalah yang sama, sudahkah Anda mengetahuinya?   -  person William Weckl    schedule 11.12.2015
comment
Menemukan jawabannya, diposting sebagai jawaban.   -  person William Weckl    schedule 14.12.2015


Jawaban (2)


Jika semua bidang Anda menggunakan penganalisis yang sama, Anda dapat menggunakan fitur elasticsearch yang disebut cross_fields. Jika tidak, Anda dapat menggunakan query_string. Sayangnya searchkick belum mendukung cross_fields dan query_string. Jadi, Anda harus melakukannya sendiri.

Indeks (penganalisis berbeda)

searchkick merge_mappings: true, mappings: {
  product: {
    properties: {
      name: {
        type: 'string',
        analyzer: 'searchkick_word_start_index',
        copy_to: 'grouped'
      },
      manufacturer_name: {
        type: 'string',
        analyzer: 'default_index',
        copy_to: 'grouped'
      },
      grouped: {
        raw: {type: 'string', index: 'not_analyzed'}
      }
    }
  }
}

Telusuri dengan cross_fields

@products = Product.search(body: {
  query: {
     multi_match: {
                  query: query,
                  type: "cross_fields",
                  operator: "and",
                  fields: [
                      "name",
                      "manufacturer_name",
                      "grouped",
                  ]
              }
         }
}

Telusuri dengan query_string

@products = Product.search(body: {
  query: {
      query_string: {
                  query: query,
                  default_operator: "AND",
                  fields: [
                      "name",
                      "manufacturer_name",
                      "grouped",
                  ]
              }
         }
}

Pembaruan - Mengubah jawaban saya untuk menggunakan penganalisis berbeda dan multi bidang mengikuti solusi ini.

Sayangnya meneruskan kueri ke elasticsearch sendiri, Anda kehilangan searchkick fitur seperti sorotan dan konversi, namun, Anda masih dapat melakukannya, menambahkannya ke kueri elasticsearch.

Menambahkan sorotan ke kueri

@products = Product.search(body: {
  query: {
    ...
  }, highlight: {
    fields: {
      name: {},
      manufacturer_name: {}
    }
  }

Menambahkan konversi ke kueri

@products = Product.search(body: {
  query: {
    bool: {
      must: {
        dis_max: {
          queries: {
            query_string: {
              ...
            }
          }
        }
      },
      should: {
        nested: {
          path: 'conversions',
          score_mode: 'sum',
          query: {
            function_score: {
              boost_mode: 'replace',
              query: {
                match: {
                  "conversions.query": query
                }
              },
              field_value_factor: {
                field: 'conversions.count'
              }
            }
          }
        }
      }
    }
  }
person William Weckl    schedule 14.12.2015
comment
dari mana Anda mendapatkan 'searchkick_word_start_index' dan 'default_index'??? - person Deez Nuuts; 28.06.2019

Cara termudah untuk melakukannya adalah dengan menggabungkan bidang menjadi satu dengan metode search_data.

class Product
  def search_data
    {
      full_name: "#{manufacturer_name} #{name}"
    }
  end
end

Pastikan untuk mengindeks ulang setelahnya. Kemudian gunakan nama lengkap untuk mencari. Semua fitur Searchkick akan terus berfungsi.

person Andrew Kane    schedule 10.08.2018