2013-09-21 2 views
1

쿼리와 검색 결과를 필터링하는 방법에 공백이 있습니다.공백으로 Xapian 필터링

#include <iostream> 
#include <string> 
#include <xapian.h> 
struct document{ 
    std::string title; 
    std::string content; 
    std::string url; 
}; 

void indexData(document d) { 
    try { 
     Xapian::WritableDatabase db("/Users/ramesh/Desktop/xapian", Xapian::DB_CREATE_OR_OPEN); 
     Xapian::TermGenerator indexer; 
     Xapian::Stem stemmer("english"); 
     indexer.set_stemmer(stemmer); 
     Xapian::Document doc; 
     doc.set_data(d.title); 
     indexer.set_document(doc); 
     indexer.index_text(d.title,1,"title"); 
     indexer.index_text(d.content,1,"content"); 
     indexer.index_text(d.url,1,"url"); 
     doc.add_boolean_term("title"+d.title); 
     db.replace_document(d.url,doc); 
     db.commit(); 
    } catch (const Xapian::Error &e) { 
     std::cout << e.get_description() << std::endl; 
     exit(1); 
    } 
} 

void searchData(std::string query_string){ 
    try{ 
     Xapian::Database db("/Users/ramesh/Desktop/xapian"); 
     Xapian::Enquire enquire(db); 
     Xapian::QueryParser qp; 
     Xapian::Stem stemmer("english"); 
     qp.set_default_op(Xapian::Query::OP_FILTER); 
     qp.set_stemmer(stemmer); 
     qp.add_prefix("","title"); 
     qp.add_prefix("","content"); 
     qp.add_boolean_prefix("title","title"); 
     qp.set_database(db); 
     qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME); 
     Xapian::Query query = qp.parse_query(query_string); 
     std::cout << "Parsed query is: " << query.get_description() << std::endl; 
     enquire.set_query(query); 
     Xapian::MSet matches = enquire.get_mset(0, 10); 
     std::cout << matches.get_matches_estimated() << " results found.\n"; 
     std::cout << "Matches 1-" << matches.size() << ":\n" << std::endl; 
     for (Xapian::MSetIterator i = matches.begin(); i != matches.end(); ++i) { 
      std::cout << i.get_rank() + 1 << ": " << i.get_weight() << " docid=" << *i 
       << " [" << i.get_document().get_data() << "]\n\n"; 
     } 
    } catch (const Xapian::Error &e) { 
     std::cout << e.get_description() << std::endl; 
     exit(1); 
    } 

} 

int main() 
{ 
    document d1,d2; 
    d1.title = "Xapain is good"; 
    d1.content = "Xapian is an open source search engine library, which allows developers to add advanced indexing and search facilities to their own applications."; 
    d1.url = "http://www.xapian.org"; 
    d2.title = "Xapain is awesome"; 
    d2.content = "good Xapian is an open source search engine library, which allows developers to add advanced indexing and search facilities to their own applications."; 
    d2.url = "http://www.xapian.org/test"; 
    indexData(d1); 
    indexData(d2); 
    searchData("xapian title:good"); 
    searchData("xapian title:Xapian is good"); 
    return 0; 
} 

첫 번째 쿼리 "xapian title : good"이 잘 작동합니다.

하지만 "xapian title : Xapian is good"은 실패합니다.

중 하나는 문제

+0

귀하의 주요 문제는 당신이 그런 다음 title'과'content' 블록하지만'로 접두사를 설정하는 것입니다 포함해야한다 'QueryParser'의 필드 이름을 빈 접두사 (예 :'qp.add_prefix ("", "title");')에 매핑합니다. 'Termerener.index_text (d.title, 1, "S");'및'qp.add_prefix (') '와 같이 작동하도록 설계된'TermGenerator'와'QueryParser'가 대문자로 된 접두어를 사용하고 싶습니다. "S", "title");'. –

답변

0

당신은 같은 제목을 정의하는 무엇인지 설명해 주시겠습니까 :

d1.title = "Xapain is good";

와 검색 쿼리는 다음과 같습니다

searchData("xapian title:Xapian is good");

수 있었 문제는 "Xapain"에 대해 "Xapian"의 철자를 잘못 썼다는 것입니까?

searchData() 메소드에서
+0

나는 그렇게 생각하지 않는다. 어떻게 두 가지 방법을 시도 했는가 – Ramesh

-1

, 당신은

document d; 

qp.add_prefix(d.title,"title"); 
qp.add_prefix(d.content,"content"); 

대신

qp.add_prefix("","title"); 
qp.add_prefix("","content"); 
+0

나는 그것이 실제로 무엇을 할 지 모르겠다. 그러나 여기서 필요한 것을하지 않을 것이다. 'add_prefix()'에 대한 첫 번째 매개 변수는 데이터베이스에 저장된 접두어입니다 (접두사로 필드 이름을 사용하면 복잡해집니다). –

관련 문제