Re: Synonyms

Андрей sc_93 at list.ru
Thu Sep 11 07:53:12 BST 2025


Thanks for the quick reply! I really appreciate your help but still no luck with synonums. The goal is to get some results from database providing synonum to query not origin word.
 
Full code example:
 
#pragma warning(disable : 4996)
#include <iostream>
#include "xapian.h"
 
int main()
{
    Xapian::WritableDatabase db("./index_data_test", Xapian::DB_CREATE_OR_OPEN);
    //db.add_synonym("time", "clock");
     db.add_synonym("ягода", "арбуз");
 
    Xapian::TermGenerator indexer;
    indexer.set_database(db);
    indexer.set_flags(indexer.FLAG_SPELLING);
 
    //Xapian::Stem stemmer("ru"); //no effect
    //indexer.set_stemmer(stemmer);
 
    //std::string content = "Old clock";
     std::string content = "спелый арбуз";
    Xapian::Document doc1;
    doc1.set_data(content);
    indexer.set_document(doc1);
    indexer.index_text(content);
    db.add_document(doc1);
    db.commit();
    db.close();
 
    Xapian::Database db1("./index_data_test");
    //std::string word = "time";
     std::string word = "ягода";
    for (auto t = db1.synonyms_begin(word); t != db1.synonyms_end(word); t++)
    {
        std::cout << "A synonym for " << word << " is " << *t << "\n";
    }
    std::cout << db1.get_description() << " " << db1.get_doccount() << std::endl;
 
    Xapian::Enquire enquire(db1);
    Xapian::QueryParser qp;
    //qp.set_stemmer(stemmer);
    qp.set_database(db1);
    //qp.set_stemming_strategy(qp.STEM_ALL);
 
    Xapian::Query query = qp.parse_query("~" + word, Xapian::QueryParser::FLAG_DEFAULT | Xapian::QueryParser::FLAG_SYNONYM); // no result without "~". FLAG_AUTO_SYNONYMS is the way to avoid "~"
    enquire.set_query(query);
    Xapian::MSet matches = enquire.get_mset(0, db1.get_doccount());
    std::cout << matches.get_matches_estimated() << std::endl;
    std::cout << matches.size() << std::endl;
 
    db1.close();
}
 
- If I use Russain there are no matches in database:
A synonym for ягода is арбуз
Database() 1
0
0
 
- If I use English the output results are:
A synonym for time is clock
Database() 1
1
1
 
Am I indexing wrong way?
Or it is need to put some extra flags while building? Using:
./configure  CC="cl -nologo" CXX="D:/_CPP/xapian-core-1.4.29/compile cl -nologo" CXXFLAGS="-EHsc -Zi" AR=lib CPPFLAGS="-I/D/_CPP/_Lib/zlib/include" LDFLAGS="-L/D/_CPP/_Lib/zlib/lib" --prefix="D:/x" 
 
 
 
-----
Андрей
 
 


More information about the Xapian-discuss mailing list