1

Lucene 上に構築された検索システムが組み込まれた Umbraco を使用しています。

ウェブサイト上の各ドキュメントにはタグのリストが含まれており、これらはタグが CSV 形式で含まれる単一のフィールドとして Luence によってインデックス化および保持されます。

例えば:

Red,Green,Blue

ただし、Umbraco (これもLukeを使用) を介してこのフィールドを検索すると、正しい動作が得られません。

「赤」の検索は機能しますが、「緑」または「青」の検索は機能しません。

Lucene についての私の理解からすると、これはすべてアナライザーが CSV 形式を理解していないことが原因です。アナライザーは、トークンに分割するためにコンマを使用してトークン化する必要があります。

しかし、私はこれを達成する方法に途方に暮れています。

それはよくある問題のように思えるので、非常に明白な何かが欠けているに違いありません。

4

2 に答える 2

0

私は最近、まさにこれを行う Umbraco 6.1.3 サイトを構築しました。タグは、ドキュメント タイプの「タグ」プロパティに追加され、コンマ区切り形式でインデックス化されます。

Umbraco サイトにはすべてデフォルトのインデックス設定があるため、何も変更されていません。

Luke で「外部」コンテンツ インデックスを開くと、「tags」フィールドがインデックス化され、保存され、トークン化され (とりわけ)、値が期待どおりに保存されていることがわかります。

ここに画像の説明を入力

tags:loremまたはを使用して Luke で検索するとtags:ipsum、どちらも正しい結果が返されます。

タグ フィールドがトークン化されていない場合は、使用しているアナライザーを確認します。Lucene.Net.Analysis.Standard.StandardAnalyzerこれを考慮すると、 が望ましいです。私はかなり確信してWhitespaceAnalyzerいます。

または、「インデックス作成」イベントで Umbraco ドキュメントをインターセプトし、「tags_mod」という名前の新しい Lucene フィールドを作成して、tags.Replace(",", ", "). このようにして、適切にインデックスを作成する必要があります。もちろん、「tags」ではなく「tags_mod」で検索する必要があります。これは少しハッキーに感じますが、完全に有効です。これは、テキスト コンテンツを 1 つのインデックス可能なフィールドに結合するための優れたアプローチです。たとえば、いくつかのフィールドがすべて同じバイアスであり、それらすべてを個別にインデックス化、トークン化、および保存する必要がない場合などです。

于 2013-08-23T15:15:27.487 に答える
0

CSV が Lucene で機能しないことは正しいです。Umbraco フォーラムで説明されているように、関数をGatheringNodeDataExamine イベントにバインドする必要があります。これにより、カスタム インデックス作成が可能になります。

この関数を使用して、CSV フィールドをコンマではなくスペースで分割し、このデータを新しいインデックス フィールドとして挿入して、それを<IndexUserFields>inspectIndex.config のセクションに含めます。

public class ExamineEvents : IApplicationStartupHandler
{
    public ExamineEvents()
    {
        ExamineManager.Instance.IndexProviderCollection[INDEX_NAME].GatheringNodeData
         += ExamineEventsGatheringNodeData;
    }

    void ExamineEventsGatheringNodeData(object sender, IndexingNodeDataEventArgs e)
    {
        if (e.IndexType == IndexTypes.Content)
        {
            var node = new Node(e.NodeId);                
            IndexCsv(e, node);                
        }
    }

    private void IndexCsv(IndexingNodeDataEventArgs e, Node node)
    {
        if (node.NodeTypeAlias == "CsvPropertyDocType" &&
           !string.isNullOrEmpty(node.GetPropertyValue("CsvProperty")))
        {
            e.Fields.Add("CsvFieldSearchable", node.GetPropertyValue("CsvProperty").Replace(","," "));
        }
    }
}

ここCsvPropertyで、 は CSV プロパティ CsvPropertyDocTypeの名前、 はプロパティを含むドキュメント タイプの名前、 は ExamineINDEX_NAMEインデックス名です。

于 2013-08-23T15:40:42.000 に答える