1

次の基準の関連性で行をソートする方法を教えてください。

`tbluser`
- - - - - - -
First Name
Last Name

`tbleduc`
- - - - - - -
School
College
University

検索フォームでは、ユーザーには次のフィールドがあります

Name
School
College
University

学校の大学と大学はオプションです..

また、名前は2つの単語に分割され(途中の他の単語は省略されます)、最初の単語が最初のanme、最後の単語が姓と見なされます.

次に、関連性に基づく検索を実装したいと思います。

助けてくれてありがとう :)

4

4 に答える 4

5

わかりました、Postgres でこれを試してみました (ここには MySQL がないので、少し違うかもしれません):

select matches.id,
      (matches.tfirstname
       + matches.tlastname 
       + matches.tschool
       + matches.tcollege
       + matches.tuniversity) as total
from (
   select u.id,
          (case when u.firstname like '%a%' then 1 else 0 end) as tfirstname,
          (case when u.lastname like '%b%' then 1 else 0 end) as tlastname,
          sum(e2.nschool) as tschool,
          sum(e2.ncollege) as tcollege,
          sum(e2.nuniversity) as tuniversity
   from tbluser u left outer join (
      select e.usr,
             (case when e.school like '%c%' then 1 else 0 end) as nschool,
             (case when e.college like '%d%' then 1 else 0 end) as ncollege,
             (case when e.university like '%e%' then 1 else 0 end) as nuniversity
      from tbleduc e
   ) e2 on u.id=e2.usr
   group by u.id, u.firstname, u.lastname
) as matches

これらの DDL ステートメントを使用して、テーブルを作成しました。

create table tbluser (
  id int primary key,
  firstname varchar(255),
  lastname varchar(255)
)


create table tbleduc (
  id int primary key,
  usr int references tbluser,
  school varchar(255),
  college varchar(255),
  university varchar(255)
)

そして少しのサンプルデータ:

insert into tbluser(id, firstname, lastname)
            values (1, 'Jason', 'Bourne');
insert into tbleduc(id, usr, school, college, university)
            values (1, 1, 'SomeSchool', 'SomeCollege', 'SomeUniversity');
insert into tbleduc(id, usr, school, college, university)
            values (2, 1, 'MoreSchool', 'MoreCollege', 'MoreUniversity');

tbluserとの関係tbleducが 1:1 の場合、クエリを少し単純化できます。

%a%, , ... を変数に置き換えることを忘れない%bでください (準備済みステートメントの使用をお勧めします)。

このテンプレートが基本的な解決策として役立つことを願っています-好きなだけ調整できます:-) 個々の結果のカウンターを取得するために、最も外側の select ステートメントを削除することもできます。

于 2010-03-21T20:02:31.120 に答える
1

テーブルで Match - Against クエリを試しましたか。結果セットは関連性 y デフォルトでソートされます。さらに、全文検索を行います。

于 2010-03-24T06:28:57.160 に答える
1

ステップ 1: 「関連性」の計算方法を定義します。

ステップ 2: ステップ 1 の計算を使用して結果の順序を決定するクエリを作成します。

残念ながら、あるレコードが別のレコードよりも「関連性が高い」または「関連性が低い」理由については言及されていないため、現時点でお伝えできるのはこれだけです.

于 2010-03-11T12:25:14.250 に答える
0

Solrを実装しようとする時間とリソースはありますか? 関連性をランク付けした検索にははるかに優れており、驚くほど簡単に使い始めることができます。

于 2010-03-23T20:57:09.770 に答える