1

Lucene を使用して、"abc" w/3 "def" w/5 "ghi" を全文検索できるようにする必要があります。このような近接検索を使用して、「abc def ghi」〜8を近似できることに気付きました。ただし、最初の 2 項で 3 以内、次の 2 項で 5 以内の正確な精度が必要です。これを行う唯一の方法は、"abc def ghi"~8 && "abc def"~3 && "def ghi"~5 を検索することです。この問題に対処する方法について、おそらくより効率的な他のアイデアを持っている人はいますか?

4

2 に答える 2

1

"abc def ghi"~8 && "abc def"~3 && "def ghi"~5 は、"abc" w/3 "def" w/5 "ghi" とは異なります。

以下の用語を含むドキュメントを見つけたいと思います。

abc,1,2,3,def,1,2,3,4,5,ghi

どちらのクエリでも、上記のドキュメントが検索されます。しかし、最初のクエリでもこれが見つかります

abc 1,2,3,4,5,6,7,8,def,1,2,3,4,5,6,8 ghi , a,b,c,d,e,f,g,h, i,abc,1,2,3,def,1,2,3,4,5,6,7,8,9,10,def,1,2,3,4,5,ghi

検索結果に 2 番目のドキュメントを表示したくないと思います。

Lucene の .NET バージョンについてはよくわかりません。スパンクエリをサポートしているようです。近接検索にはスパン クエリを使用できます。

    SpanNearQuery spanNear = new SpanNearQuery(new SpanQuery[] {
      new SpanTermQuery(new Term(FIELD, "abc")),
      new SpanTermQuery(new Term(FIELD, "def"))},
      3,
      true);

    Query queryToBeExecuted = new SpanNearQuery(new SpanQuery[] {
      spanNear,
      new SpanTermQuery(new Term(FIELD, "ghi"))},
      5,
      true);

検索には queryToBeExecuted クエリを使用できます。

詳細については、スパン クエリに関する Mark Miller の記事を参照してください。

于 2012-06-29T22:29:55.810 に答える
0

私はまったく同じ問題に直面しました。Luceneのクエリ言語はそれほど堅牢ではありません。近接検索をつなぎ合わせることができないことに加えて、近接クエリ内でブール演算とフレーズクエリを実行することも困難です。

独自のクエリパーサーを作成し、クエリプリミティブを手動でインスタンス化することで、問題を解決しました。独自のクエリパーサーを作成するのは簡単ではありませんが、柔軟性が高くなります。新しいクエリ言語では、w/Nを使用して近接クエリを指定します。これにより、次の複雑なクエリが可能になります。

foo w/3 bar w/5 biz
foo w/3 bar w/5 (biz or buz)

またはさらに複雑なクエリ

("first part" within/3 foo) w/10 ("second part" within/3 (bar or biz))

を使用してPythonでクエリパーサーを作成しpyparsingました。これはプロジェクトですが、楽しいプロジェクトであり、最終的にはluceneクエリパーサーよりもはるかに強力なものになります。

于 2012-12-05T02:11:37.417 に答える