查询匹配字段中的所有标记,而不是任何标记

时间:2012-12-03 21:24:38

标签: lucene

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

例如:

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

我的想法是我需要针对关键字字段查询整个广告标题。两者(查询和索引)都使用我自己的分析器进行分析,该分析器具有词干,小写等等。

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

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

q=+red +volvo

但由于我需要处理大量广告,这不是一种选择。

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

2 个答案:

答案 0 :(得分:0)

鉴于你确实想要完全捕捉短语“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个标记的搜索项,因此在示例中:“我卖红马”将生成像“我”,“我”这样的术语, “我是”,“红马”,“我卖”,“卖红马”等。

我认为空白过滤器可能是使用关键字进行此操作的最佳选择,但是如果遇到空白字符,它会分隔除空格以外的行,或者连续多个空格,则可能会遇到问题。 / p>

答案 1 :(得分:-1)

听起来你可以使用Lucene的MemoryIndex:“这个类主要针对相对较小的瞬态实时数据(预期搜索)搜索大量查询的全文搜索”