1

对于脚本,我需要将广告标题与 lucene 索引进行比较。
此索引包含几个关键字以及广告匹配时要采取的操作。

例如:

(keyword,action,new_category,optional)
"red volvo","recategorize","cars","red"

这个想法是我需要根据关键字字段查询整个广告标题。两者(查询和索引)都是用我自己的分析器分析的,它有词干、小写等。

我遇到的问题是部分匹配。例如:
“我在卖一匹红马”匹配“红沃尔沃”。

如果反过来(广告被编入索引,我需要按关键字查询),我可以这样做:

q=+red +volvo

但这不是一个选择,因为我需要处理大量的广告。

那么,具体的问题是,有没有办法强制字段中的所有标记与查询匹配?
我可以使用 KeywordAnalyzer,以便将整个“red volvo”视为一个标记,但我无法将整个广告标题分析为单个关键字,因为它不会匹配任何内容。

4

2 回答 2

0

鉴于您确实想准确地捕捉到“red volvo”这个短语,而不仅仅是“red”或“volvo”,那么我认为您使用关键字分析器对其进行索引是正确的。但是您希望使用比您搜索的字段更长的查询进行搜索,这与典型用例相反。

我不愿推荐它,但我认为进行此查询的正确方法可能是使用与用于创建索引的分析器不同的分析器进行查询。

如果索引的短语具有可预测的大小,例如 2-5 个单词,那么使用ShingleFilter可以从长查询中生成您需要的术语,以将其作为关键字进行搜索。

像这样的东西:

Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36);
analyzer = new ShingleAnalyzerWrapper(analyzer, 1, 5); //wrapper that adds a ShingleFilter to the analyzer
QueryParser parser = new StandardQueryParser(analyzer);  
Query query = parser.parse(query, defaultField);
searcher.search(query, 10);

这将仅在空格上拆分,然后生成长度为 1 到 5 个标记的搜索词,因此在示例中:“我正在卖一匹红马”将产生诸如“我”、“我”、“我是”之类的词”、“红马”、“我在卖”、“我在卖一匹红马”等。

我认为空白过滤器可能是使这项工作与关键字一起使用的最佳选择,但如果您遇到空白字符,它会拆分为空格以外的字符,或者连续多个空格,您可能会遇到问题。

于 2012-12-04T16:54:02.710 回答
-1

听起来您可以使用 Lucene 的MemoryIndex:“此类针对相对较小的瞬态实时数据(前瞻性搜索)的大量查询的全文搜索”

于 2012-12-03T23:27:33.650 回答